Copiar una carpeta (y su contenido) a otra carpeta
Artículo por Club Developers · 31 diciembre 2005
5601 vistas
Vamos a ver dos métodos para realizar este proceso
Uso del API ShFileOperation
Esta función del API de Windows la tenemos incluida en la unit ShellApi. Aconsejamos una revisión de la misma en la ayuda en linea para ver todas sus posibilidades ya que permite varias opciones tal como no mostrar el progreso de la copia, permitir o no UNDO, etc...
Uso de TSearchRec
Con este método pretendemos dar una visión del funcionamiento de las funciones FindFirst, FindNext y FindClose de la unidad SysUtils para recorrer archivos y carpetas
Uso del API ShFileOperation
Esta función del API de Windows la tenemos incluida en la unit ShellApi. Aconsejamos una revisión de la misma en la ayuda en linea para ver todas sus posibilidades ya que permite varias opciones tal como no mostrar el progreso de la copia, permitir o no UNDO, etc...
delphi
procedure TForm1.Button1Click(Sender: TObject); function CopiaTodo(Origen,Destino : String) : LongInt; var F : TShFileOpStruct; sOrigen, sDestino : String; begin Result := 0; sOrigen := Origen + #0; sDestino := Destino + #0; with F do begin Wnd := Application.Handle; wFunc := FO_COPY; pFrom := @sOrigen[1]; pTo := @sDestino[1]; fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION end; Result := ShFileOperation(F); end; begin CopiaTodo('c:\Delphi3\*.*','c:\kk'); end;
Uso de TSearchRec
Con este método pretendemos dar una visión del funcionamiento de las funciones FindFirst, FindNext y FindClose de la unidad SysUtils para recorrer archivos y carpetas
delphi
procedure TFileDatos.CopyDirectory( Origen, // carpeta origen Destino, // carpeta destino Mask: string; // mascara de copia Process: boolean // procesar mensajes después de la copia de cada fichero ); var Files: integer; FOrigen: string; FDestino: string; ok: boolean; Search: TSearchRec; begin // nos aseguramos que las carpetas terminan con la barra invertida "\" Origen := IncludeTrailingPathDelimiter(Origen); Destino := IncludeTrailingPathDelimiter(Destino); Files := FindFirst(Origen + Mask, faAnyFile, Search); while Files = 0 do begin // si no es una carpeta... if Search.Attr <> faDirectory then begin FOrigen := Origen + Search.Name; FDestino := Destino + Search.Name; ok := CopyFile(PChar(FOrigen), PChar(FDestino), false); if not ok then raise Exception.Create('No se pudo copiar el fichero: ' + Search.Name); end else // si es una carpeta... begin if (Search.Name <> '.') and (Search.Name <> '..') then begin ok := CreateDir(Destino + Search.Name); if not ok then raise Exception.Create('No se pudo crear el directorio: ' + Search.Name) else CopyDirectory(Origen + Search.Name, Destino + '\' + Search.Name, Mask); end; end; Files := FindNext(Search); if Process then Application.ProcessMessages; end; FindClose(Search); end;