In more recent versions of Delphi, there is a function that does this: IOUtils.TDirectory.GetFiles, to use it, add IOUtils in Uses.
Use like this:
Uses
IOUtils;
//...
procedure TForm1.Button2Click(Sender: TObject);
const
EXTENSAO = '*.prj';
var
DynArray: TStringDynArray;
Diretorio, DiretorioBackup, DiretorioResultado: string;
Arquivo, NomeArquivo: string;
TotalArquivos, Sucessos, Erros: Integer;
begin
// Cria um diretório "backup" na pasta selecionada
DiretorioBackup := IncludeTrailingBackslash('Backup');
// Cria o diretório para onde será movido os arquivos
DiretorioResultado := IncludeTrailingBackslash('Resultado');
try
// Para selecionar somente diretórios!
FileOpenDialog1.Options := [fdoPickFolders];
if FileOpenDialog1.Execute = False then exit;
// Atenção! Se for pegar o diretório de um arquivo use o ExtractFileDir/ExtractFilePath
Diretorio := IncludeTrailingBackslash(FileOpenDialog1.FileName);
// Se o diretório de backup não existir, um é criado
if not DirectoryExists(Diretorio + DiretorioBackup) then
CreateDir(Diretorio + DiretorioBackup);
// Se o diretório não existir, cria-se um
if not DirectoryExists(Diretorio + DiretorioResultado) then
CreateDir(Diretorio + DiretorioResultado);
// Pega os arquivos com a extensão definida constante EXTENSAO, procura em todos
// diretórios e subdiretórios
DynArray := TDirectory.GetFiles(Diretorio, EXTENSAO, TSearchOption.soAllDirectories);
for Arquivo in DynArray do
begin
Inc(TotalArquivos);
// Extrai o nome do arquivo
NomeArquivo := ExtractFileName(Arquivo);
// Faz a cópia dos arquivos para o diretório de backup
// Se o backup existir, ele é substituído, os arquivos terão extensão ".ZZZ"
CopyFile(pchar(Arquivo), pchar(Diretorio + DiretorioBackup + NomeArquivo + '.ZZZ'), false);
// Move os arquivos para o diretório "resultado"
if MoveFile(pchar(Arquivo), pchar(Diretorio + DiretorioResultado + NomeArquivo)) then
Inc(Sucessos)
else
Inc(Erros);
end;
MessageBox(0,
pchar(Format('Total: %d' + sLineBreak + 'Arquivos movidos: %d Erros: %d',
[TotalArquivos, Sucessos, Erros])),
'Backup',
MB_ICONINFORMATION);
finally
end;
end;
Alternative
Another alternative is to use the functions Findfirst and FindNext recursively to search for files:
procedure ListarArquivos(Dir: string; const Ext: string; const Lista: TStringList);
var
SR: TSearchRec;
begin
Dir := IncludeTrailingBackslash(Dir);
if FindFirst(Dir + '*.*', faAnyFile or faDirectory, SR) = 0 then
try
repeat
if ((SR.Attr and faDirectory) = 0) and (Pos(Ext, SR.Name) > 0) then
lista.Add(dir + SR.Name)
else if (SR.Name <> '.') and (SR.Name <> '..') then
ListarArquivos(Dir + SR.Name, Ext, Lista);
until FindNext(Sr) <> 0;
finally
FindClose(SR);
Application.ProcessMessages;
end;
end;
To use do:
procedure TForm1.Button1Click(Sender: TObject);
const
EXTENSAO = '.prj'; // Sem o coringa!
var
ListaArquivos: TStringList;
Diretorio, DiretorioBackup, DiretorioResultado: string;
Arquivo, NomeArquivo: string;
TotalArquivos, Sucessos, Erros: Integer;
begin
// Cria um diretório "backup" na pasta selecionada
DiretorioBackup := IncludeTrailingBackslash('Backup');
// Cria o diretório para onde será movido os arquivos
DiretorioResultado := IncludeTrailingBackslash('Resultado');
try
ListaArquivos := TStringList.Create;
// Para selecionar somente diretórios!
FileOpenDialog1.Options := [fdoPickFolders];
if FileOpenDialog1.Execute = False then exit;
// Atenção! Se for pegar o diretório de um arquivo use o ExtractFileDir/ExtractFilePath
Diretorio := IncludeTrailingBackslash(FileOpenDialog1.FileName);
// Se o diretório de backup não existir, um é criado
if not DirectoryExists(Diretorio + DiretorioBackup) then
CreateDir(Diretorio + DiretorioBackup);
// Se o diretório não existir, cria-se um
if not DirectoryExists(Diretorio + DiretorioResultado) then
CreateDir(Diretorio + DiretorioResultado);
// Pega os arquivos com a extensão definida constante EXTENSAO, procura em todos
// diretórios e subdiretórios
ListarArquivos(Diretorio, EXTENSAO, ListaArquivos);
for Arquivo in ListaArquivos do
begin
Inc(TotalArquivos);
// Extrai o nome do arquivo
NomeArquivo := ExtractFileName(Arquivo);
// Faz a cópia dos arquivos para o diretório de backup
// Se o backup existir, ele é substituído, os arquivos terão extensão ".ZZZ"
CopyFile(pchar(Arquivo), pchar(Diretorio + DiretorioBackup + NomeArquivo + '.ZZZ'), false);
// Move os arquivos para o diretório "resultado"
if MoveFile(pchar(Arquivo), pchar(Diretorio + DiretorioResultado + NomeArquivo)) then
Inc(Sucessos)
else
Inc(Erros);
end;
MessageBox(0,
pchar(Format('Total: %d' + sLineBreak + 'Arquivos movidos: %d Erros: %d',
[TotalArquivos, Sucessos, Erros])),
'Backup',
MB_ICONINFORMATION);
finally
ListaArquivos.Free;
end;
end;
Note: Both examples create two directories, one to save backups of the files, these will have the extension .zzz, the second directory is where the files will be moved to .prj.
What version of Delphi? You want to copy the files or move them?
– stderr
Delhpi Xe-8, move them would be ideal.
– Guilherme Lima