Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer y contar todos los achivos (https://www.clubdelphi.com/foros/showthread.php?t=63147)

RoyTan 31-01-2009 00:14:24

Leer y contar todos los achivos
 
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 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.

Código Delphi [-]
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:
Código Delphi [-]
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 Noteví 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?

Pedro-Juan 16-04-2011 17:57:04

Hola, yo lo he resuelto así:

Código Delphi [-]
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.

Código Delphi [-]
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:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  TotalFiles:= 0;
  TotalFolders:= 0;
  TotalFilesFolders('C:\');
  ShowMessage(Format('Archivos: %d Carpetas: %d',[TotalFiles,TotalFolders]));
end;

Un saludo.


La franja horaria es GMT +2. Ahora son las 07:57:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi