Ir al contenido


Foto

[RESUELTO] El Conde Contar, ¡¡MUAHAHAHAHA!! (Contar archivos de un directorio)


  • Por favor identifícate para responder
9 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 julio 2010 - 09:51

Y siguiendo con las preguntas que no tienen una solución fácil. Resulta que ahora debo saber cuántos archivos contiene una carpeta o subdirectorio en particular (obviando las consabidas "." y "..") para generar un número consecutivo de archivo, en ésta forma:

#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.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2010 - 09:55

Pregunta, y que extension van a tener esos archivos, txt, db, px, zip.......

Salud OS
  • 0

#3 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

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. ;) (h)
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

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. ;) (h)


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
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2010 - 10:30

A ver que te parece esta "chapuza" :D :D :D



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   Lista: TStringList;
  4.   SRec: TSearchRec;
  5.   Contador: integer;
  6. begin
  7.   Lista := TStringList.Create;
  8.   Contador := -1;
  9.   if FindFirst('C:\Proyectos\pruebas\consecutivos\*.*', faAnyFile, SRec) = 0 then
  10.   REPEAT
  11.     Lista.Add(SRec.Name);
  12.     Inc(Contador);
  13.   UNTIL FindNext(SRec) <> 0;
  14.   FindClose(SRec);
  15.   ShowMessage(Lista.Text+#13+'Siguiente Archivo = Archivo.'+format('%.*d',[3,Contador]));
  16. end;



Salud OS

Edito: Adjunto una imagen de mi directorio ;)

Archivos adjuntos


  • 0

#6 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 julio 2010 - 10:41

A ver que te parece esta "chapuza" :D :D :D ...


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.
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 julio 2010 - 10:45

Y pues como se dijera en el campo de batalla, va el lucidor :D :D :D



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   Lista: TStringList;
  4.   SRec: TSearchRec;
  5. begin
  6.   Lista := TStringList.Create;
  7.   if FindFirst('C:\Proyectos\pruebas\consecutivos\*.*', faAnyFile, SRec) = 0 then
  8.   REPEAT
  9.     Lista.Add(SRec.Name);
  10.   UNTIL FindNext(SRec) <> 0;
  11.   FindClose(SRec);
  12.   ShowMessage('Ultimo Archivo: '+Lista.Strings[Lista.Count-1]+#13+
  13.               'Siguente Archivo: Archivo.'+
  14.               format('%.*d',[3,strtoint(copy(ExtractFileExt(Lista.Strings[Lista.Count-1]),2,3))+1]));
  15. end;



Salud OS
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 11 julio 2010 - 03:34

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 :p

Nos leemos

  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

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 :p

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
  • 0

#10 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 28 julio 2010 - 02:18

Buenas,

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 :p

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" :)



delphi
  1. var
  2.   SRec: TSearchRec;
  3.   Num: Integer;
  4.   Tmp: Integer;
  5.   Ext: string;
  6. begin
  7.   Num := -1; // si el primer arvhico es el '000'. Si fuera el '001' se inicializaría a 0
  8.   if FindFirst('D:\Docs\ADV\*.*', faArchive, SRec) = 0 then
  9.     repeat
  10.       Ext := ExtractFileExt(SRec.Name); // nos devuelve la extensión con el "." separador del nombre
  11.       // si la extensión es un número válido y éste es más grande que el que ya teníamos, lo cogemos
  12.       if TryStrToInt(RightStr(Ext, length(Ext)-1), Tmp) and (Tmp > Num) then
  13.         Num := Tmp;
  14.     until FindNext(SRec) <> 0;
  15.   FindClose(SRec);
  16.  
  17.   ShowMessage('El nuevo archivo será: ' + IntToStr(Num+1));
  18. end;



De todas formas hay que tener en cuenta que esto tiene la limitación de 1000 archivos ;)

Nos leemos

  • 0




IP.Board spam blocked by CleanTalk.