PDA

Ver la Versión Completa : Leer y contar todos los achivos


RoyTan
31-01-2009, 00:14:24
Saludos foreros del club delphi.

Seria posible leer y contar todos los archivos y carpetas de una unidad por ejemplo la unidad C.

Gracias.

dec
31-01-2009, 01:30:53
Hola,

Busca, en estos mismos foros, por las funciones "FindFirst()" y "FindNext()". Si no recuerdo mal, también encontrarás algún truco (http://www.clubdelphi.com/trucos/) relacionado con este asunto. Si necesitas ayuda no dejes de decirlo. Y, si alguien conoce un método mejor, que hable ahora o calle para siempre. :rolleyes: ;)

jorge82
31-01-2009, 02:15:51
Hola, esta función recorre el directorio pasado como parámetro y lista los archivos y directorios, además lleva la cuenta de ellos, al final guarda la lista en un StringList, por lo que facilmente puedes asignar su contenido en un TMemo o componente similar.


procedure Contar(SPath: string);
var
R : TSearchRec;
Busq, Dirs, Arcs: Integer;
List: TStringList;
begin
Dirs :=0; Arcs := 0;
List := TStringList.Create;

if not DirectoryExists(SPath) then
begin
Application.MessageBox(PChar('No existe la ruta: ' + SPath), 'Error', MB_ICONERROR);
Exit;
end;

Busq := FindFirst(SPath + '*.*', FaAnyfile, R);
while Busq = 0 do
begin
if (R.Attr and faDirectory = faDirectory ) then
begin
if (R.Name <> '.') and (R.Name <> '..') then
begin
Inc(Dirs);
List.Add(R.Name + '/');
end;
end
else
begin
if (R.Attr and faVolumeId <> faVolumeID) then
begin
Inc(Arcs);
List.Add(R.Name);
end;
end;
Busq := FindNext(R);
end;
SysUtils.FindClose(R);
Form1.Memo1.Lines := List;
List.Free;
ShowMEssage(Format('Hay %d Directorios y %d Archivos', [Dirs, Arcs]));
end;


Ejemplo de llamada:

procedure TForm1.Button1Click(Sender: TObject);
begin
Contar('C:\');
end;


Espero que te sirva.

RoyTan
31-01-2009, 15:58:46
Fantastico Jorge82, y gracias Dec.

Todo de maravilla.

Pedro-Juan
12-02-2011, 13:06:40
Hola.

Sólo me funciona en el directorio raiz de cada unidad, en los interiores no.

El ShowMEssage en los interiores: Hay 1 directorios y 0 archivos.
Cuando hay más directorios y archivos.

No estoy muy enterado del tema de ficheros y no encuentro el porqué del error.

Un saludo.

pato89xd
16-04-2011, 14:07:58
hola, yo tengo el mismo problema, este algoritmo solo me encuentra un directorio y 0 archivos, que puedo hacer? :S

Casimiro Notevi
16-04-2011, 14:32:53
Tal y como dice jorge82, "esta función recorre el directorio pasado como parámetro" ;)

A ambos, buscad en clubdelphi, arriba está la opción "Buscar".
Una pista: las funciones son FindFirst y FindNext ;)

Delfino
16-04-2011, 16:53:31
Probaste el componente TJvSearchFiles de la suite open source JVCL (http://jvcl.delphi-jedi.org/)?

Pedro-Juan
16-04-2011, 17:57:04
Hola, yo lo he resuelto así:


cPath := Trim(F_Main.DirectoryEdit1.Text) + '\';

//Ejemplo de llamada
Contar(cPath);

procedure Contar(SPath: string);
var R : TSearchRec;
Busq, nArchivos: Integer;
begin
nArchivos := 0;

if not DirectoryExists(SPath) then begin
Application.MessageBox(PChar('No existe la ruta: ' + SPath), 'Error', MB_ICONERROR);
Exit;
end;

Busq := FindFirst(SPath + '*.*', FaAnyfile, R);

while Busq = 0 do begin
if (R.Attr and faVolumeId <> faVolumeID) and (R.Name <> '.') and (R.Name <> '..') then begin
if (R.Attr <> faVolumeID) and (R.Attr and faDirectory <> faDirectory) then begin
Inc(nArchivos);

// Lo que tengas que hacer

end;
end;
Busq := FindNext(R);
end;

SysUtils.FindClose(R);
end;


Lo que a mi me fallaba era la barra de directorio al final de la variable de la ruta pasada como parámetro. Ahora me da el número exacto de archivos en un directorio. Sólo me cuenta los archivos, no los directorios.

Espero que te sirva.

Un saludo.

ecfisa
17-04-2011, 00:13:00
Hola.


var
TotalFiles,TotalFolders: LongInt;

procedure TotalFilesFolders(Path:string);
var
SR: TSearchRec;
begin
ChDir(Path);
if FindFirst ('*.*', faDirectory, SR )=0 then
repeat
if ((SR.Attr and fadirectory) = fadirectory) then
begin
if (SR.Name <> '.') and (SR.Name <> '..') then
begin
Inc(TotalFolders);
TotalFilesFolders(Path + '\' + SR.Name );
end
end
else
Inc(TotalFiles);
until FindNext(SR) <> 0;
FindClose( SR );
end;


Llamada ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
TotalFiles:= 0;
TotalFolders:= 0;
TotalFilesFolders('C:\');
ShowMessage(Format('Archivos: %d Carpetas: %d',[TotalFiles,TotalFolders]));
end;


Un saludo.