Hola gdlrinfo.
Fijate si te sirve de este modo:
Código Delphi
[-]
...
uses ShellApi;
procedure FindFilesByExt(Folder, Ext:AnsiString; Files: TStrings);
var
SR: TSearchRec;
Found: Boolean;
begin
if FindFirst(Folder + '*.*', $FF, SR) = 0 then
repeat
Found:= Pos(UpperCase(Ext), UpperCase(SR.Name)) <> 0;
if ((SR.Attr and fadirectory) = fadirectory) then begin
if(SR.Name <> '.') and (SR.Name <> '..') then FindFilesByExt(Folder + SR.Name, Ext, Files) end
else if Found then Files.Add(Folder + SR.Name); until FindNext(SR) <> 0;
FindClose(SR);
end;
procedure CopyFilesWithoutDir(Source, Target, Ext: AnsiString);
const
INVALID_FILE_ATTRIBUTES = Cardinal($FFFFFFFF);
var
TS : TStrings;
i : Integer;
SHFOS: SHFILEOPSTRUCT;
begin
Source:= IncludeTrailingPathDelimiter(Source);
Target:= IncludeTrailingPathDelimiter(Target);
if (GetFileAttributesA(PChar(Source)) = INVALID_FILE_ATTRIBUTES) then
raise Exception.Create('Carpeta origen inválida');
if (GetFileAttributesA(PChar(Target)) = INVALID_FILE_ATTRIBUTES) then
raise Exception.Create('Carpeta destino inválida');
TS:= TStringList.Create;
try
FindFilesByExt(Source, Ext, TS);
if TS.Count > 1 then
for i:= 0 to TS.Count-1 do
begin
ZeroMemory(@SHFOS, SizeOf(SHFOS));
SHFOS.Wnd:= Application.Handle;
SHFOS.wFunc:= FO_COPY;
SHFOS.hNameMappings:= nil;
SHFOS.pFrom:= PChar(TS[i]+#0+#0);
SHFOS.pTo:= PChar(Target+#0+#0);
SHFileOperation(SHFOS);
end;
finally
TS.Free;
end;
end;
Llamada de ejemplo:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor:= crHourGlass; try
CopyFilesWithoutDir('C:\Users\usr\Documents', 'C:\temp\', '.odt');
finally
Screen.Cursor:= crDefault; MessageBox(0, 'Copia finalizada', '', MB_ICONINFORMATION);
end;
end;
Saludos