Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cambiar atributos a todo un directorio (https://www.clubdelphi.com/foros/showthread.php?t=15299)

Walterdf 18-10-2004 15:18:34

Cambiar atributos a todo un directorio
 
Buenas
Necesito cambiar los atributos de los archivos existentes en un directorio y a su vez de todos sus subdirectorios. Estoy intentando con findfirst, filesetatt pero no se como hacerlo recursivamente para cada uno de los ficheros y subdirectorios.
Si alguien me da una mano con el codigo se lo agradeceré.
Walter

Neftali [Germán.Estévez] 19-10-2004 11:24:57

Cita:

Empezado por Walterdf
...cambiar los atributos de los archivos existentes en un directorio y a su vez de todos sus subdirectorios.

Puedes empezar por mirarte los trucos 310 y 333 del ClubDelphi; Ambos trabajan borrando ficheros y directorios de forma recursiva; El funcionamiento/algoritmo es similar al que tú necesitas; La variante es que tú no debes borrar, sino cambiar atributos (con FileSetAttr) y que sólo debes tener en cuenta directorios (para ello debes comparar el Searchrec.Attr con faDirectory).

Échale un vistazo y haz pruebas, estoy seguro que cambiando un par de cosas es justo lo que necesitas.

Si aun así no te aclaras ya dirás...

http://www.clubdelphi.com/vertruco.php?id=310
http://www.clubdelphi.com/vertruco.php?id=333

Walterdf 19-10-2004 19:36:42

Buenas
En resumen, lo que necesito es sacar el atributo de solo lectura de todo (subdirectorios, archivos, etc) lo que haya dentro de una determinado directorio.

Hice caso a la sugerencia de Neftali pero no logro cambiar los attributos de los subdirectorios.
El código es el siguiente:

Código Delphi [-]
var
   search : TSearchRec;
   nFiles : integer;
   cPath : String;

begin
  cPath:='c:\MiCarpeta\';
  nFiles:=FindFirst(cPath + '*.*', faAnyFile,  search );
  while nFiles = 0 do
  begin
    if Search.Attr = faDirectory then
    begin
      if (Search.Name<>'.') and (Search.Name<>'..') then
      begin
        SetFileAttributes(PChar(cPath + search.Name),FILE_ATTRIBUTE_NORMAL);
      end;
    end
    else
      SetFileAttributes(PChar(cPath + search.Name),FILE_ATTRIBUTE_NORMAL);
      nFiles:=FindNext(Search);
  end;
end;

Con este codigo me cambia todos los atributos de todo lo que contiene el nivel "c:\MiCarpeta" pero no de los subdirectorios y sus contenidos que hay allí adentro.
Alguna sugerencia?
Muchas gracias

Neftali [Germán.Estévez] 20-10-2004 12:33:41

Cita:

Empezado por Walterdf
...Con este codigo me cambia todos los atributos de todo lo que contiene el nivel "c:\MiCarpeta" pero no de los subdirectorios y sus contenidos que hay allí adentro.
Alguna sugerencia?

Te falta implementar la recursividad; Pasa éste procedimiento a una función recursiva y la llamas desde el propio procedimiento; Prueba con ésta (hay alguna modificación).

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
 
  // Rutina para cambiar atributos
  procedure ChangeAttributes(const path:String);
  var
     search : TSearchRec;
     nFiles : integer;
     cPath : String;
  begin
    cPath:= path{'c:\MiCarpeta\'};
    nFiles:=FindFirst(cPath + '*.*', faAnyFile,  search );
    while nFiles = 0 do begin
      if Search.Attr = faDirectory then begin
        if (Search.Name<>'.') and (Search.Name<>'..') then begin
          SetFileAttributes(PChar(cPath + search.Name),FILE_ATTRIBUTE_NORMAL);
          // llamada recursiva
          ChangeAttributes(Path + search.Name + '\');
        end;
      end
      else begin
        SetFileAttributes(PChar(cPath + search.Name),FILE_ATTRIBUTE_NORMAL);
        // llamada recursiva
        ChangeAttributes(Path + search.Name + '\');
      end;
      // Siguiente
      nFiles:=FindNext(Search);
    end;
  end;
begin
  ChangeAttributes(Edit1.Text);
end;

Walterdf 20-10-2004 16:55:44

Gracias por la ayuda!!!
No me daba cuenta de como tenía que realizar la recursividad, esto me sirvió muchísimo.
Saludos y gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 13:11:40.

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