[RESUELTO] El Conde Contar, ¡¡MUAHAHAHAHA!! (Contar archivos de un directorio)
#1
Escrito 09 julio 2010 - 09:51
#Proceso + Municipio + Localidad + Atención + NúmeroConsecutivo
Todos los datos anteriores al número consecutivo los tengo, así que solamente necesito saber cuántos archivos ya están dentro del subdirectorio para que mi nuevo archivo tenga un nombre propio y distintivo. El punto es que no puedo usar ningún componente que no sean los propios de Delphi 7 y/o las librerías JEDI...
Agradecido de antemano.
#2
Escrito 09 julio 2010 - 09:55
Salud OS
#3
Escrito 09 julio 2010 - 10:00
Pregunta, y que extension van a tener esos archivos, txt, db, px, zip.......
Salud OS
Puede ser cualquier extensión. PDF, JPG, TXT, DOC..., el punto es saber cuántos archivos hay, no importa el tipo.
#4
Escrito 09 julio 2010 - 10:20
Pregunta, y que extension van a tener esos archivos, txt, db, px, zip.......
Salud OS
Puede ser cualquier extensión. PDF, JPG, TXT, DOC..., el punto es saber cuántos archivos hay, no importa el tipo.
Se me ocurre de primera instancia usar el consecutivo como extensón, como no importa, pues con eso puedes obtener fácilmente el último valor.
Si eso no "embona" podemos buscar otras soluciones que finalmente tienen el mismo concepto.
Estoy haciendo una pequeña prueba que puede solucionar tu problema.
Salud OS
#5
Escrito 09 julio 2010 - 10:30
procedure TForm1.Button1Click(Sender: TObject); var Lista: TStringList; SRec: TSearchRec; Contador: integer; begin Lista := TStringList.Create; Contador := -1; if FindFirst('C:\Proyectos\pruebas\consecutivos\*.*', faAnyFile, SRec) = 0 then REPEAT Lista.Add(SRec.Name); Inc(Contador); UNTIL FindNext(SRec) <> 0; FindClose(SRec); ShowMessage(Lista.Text+#13+'Siguiente Archivo = Archivo.'+format('%.*d',[3,Contador])); end;
Salud OS
Edito: Adjunto una imagen de mi directorio
Archivos adjuntos
#6
Escrito 09 julio 2010 - 10:41
A ver que te parece esta "chapuza" ...
Pus ni tan chapucero..., al menos no dependo más que de Delphi para obtener la cantidad de archivos...
Me va a servir mucho para solucionar mi problema, gracias Eliseo.
#7
Escrito 09 julio 2010 - 10:45
procedure TForm1.Button2Click(Sender: TObject); var Lista: TStringList; SRec: TSearchRec; begin Lista := TStringList.Create; if FindFirst('C:\Proyectos\pruebas\consecutivos\*.*', faAnyFile, SRec) = 0 then REPEAT Lista.Add(SRec.Name); UNTIL FindNext(SRec) <> 0; FindClose(SRec); ShowMessage('Ultimo Archivo: '+Lista.Strings[Lista.Count-1]+#13+ 'Siguente Archivo: Archivo.'+ format('%.*d',[3,strtoint(copy(ExtractFileExt(Lista.Strings[Lista.Count-1]),2,3))+1])); end;
Salud OS
#8
Escrito 11 julio 2010 - 03:34
Y digo yo, amigo egostar, para qué usar un objeto para ese menester y "cargar" la memoria y "relentizar" el proceso con él? Lo más simple y lógico es un contador, ahorrando memoria y dando velocidad al código ("tarda menos" en incrementar el valor de un entero que añadir un texto a un TStringList).
Además, podría darse el caso improbable que la cantidad de archivos superara la capacidad del TStringList, cosa que con una variable se puede solucionar fácilmente con un DWord o tipo de variables con más capacidad
Nos leemos
#9
Escrito 11 julio 2010 - 03:36
Buenas,
Y digo yo, amigo egostar, para qué usar un objeto para ese menester y "cargar" la memoria y "relentizar" el proceso con él? Lo más simple y lógico es un contador, ahorrando memoria y dando velocidad al código ("tarda menos" en incrementar el valor de un entero que añadir un texto a un TStringList).
Además, podría darse el caso improbable que la cantidad de archivos superara la capacidad del TStringList, cosa que con una variable se puede solucionar fácilmente con un DWord o tipo de variables con más capacidad
Nos leemos
Si, inicialmente pensé en esa solución y nos olvidamos , sin embargo hay que notar que necesitamos conocer el útimo archivo creado, por eso es que he puesto la segunda solución, imaginemos este escenaio.
Tenemos los archivos
Archivo.001
Archivo.002
Archivo.003
Archivo.004
Archivo.005
Archivo.006
= 6 archivos
El archivo siguiente sería el 007 lógicamente.
Pero que pasa si por alguna razón borran los archivos 002 y 003
Archivo.001
Archivo.004
Archivo.005
Archivo.006
= 4 Archivos, el siguiente archivo debería ser el 005, pero ya existe.
Gracias por tu comentario
Salud OS
#10
Escrito 28 julio 2010 - 02:18
Cierto egostar, no caí en ese caso cuando te respondí. No obstante, el TStringList deberías de ordenarlo (método Sort) antes de dar el valor y en el FindFirst usaría faArchive, así quitamos las carpetas
A mi me gusta la clase TStrings, la verdad es que la uso mucho, pero me he emperrado en no usarlo en este caso, así que te daré otra solución sin él
Dado que lo que cambia es un dato "numérico", y por lo que veo en el ejemplo que das es la extensión del archivo (cosa que facilita las cosas), podemos usar ese número para saber cuál es el último fichero. Podría ser algo así aunque puede parecer "algo más complejo"
var SRec: TSearchRec; Num: Integer; Tmp: Integer; Ext: string; begin Num := -1; // si el primer arvhico es el '000'. Si fuera el '001' se inicializaría a 0 if FindFirst('D:\Docs\ADV\*.*', faArchive, SRec) = 0 then repeat Ext := ExtractFileExt(SRec.Name); // nos devuelve la extensión con el "." separador del nombre // si la extensión es un número válido y éste es más grande que el que ya teníamos, lo cogemos if TryStrToInt(RightStr(Ext, length(Ext)-1), Tmp) and (Tmp > Num) then Num := Tmp; until FindNext(SRec) <> 0; FindClose(SRec); ShowMessage('El nuevo archivo será: ' + IntToStr(Num+1)); end;
De todas formas hay que tener en cuenta que esto tiene la limitación de 1000 archivos
Nos leemos