Возникла тут у меня задача обработать 103943 файла расположенных в 2618 папках.
И хотя у меня есть процедура для того чтобы получить список всех файлов задача требует чтобы все файлы были в одной папке.
Ну раз требует, то сделаем. За основу взял ту же процедуру, что выложил по ссылке выше.
Подумав немного получил на выходе:
procedure AllFiles2one( Path,path2: string );
var
sRec: TSearchRec;
isFound: boolean;
begin
try
mkdir(path2); // создаем папку куда все это копируем.
except
end;
isFound := FindFirst( Path + ‘\*.*’, faAnyFile, sRec ) = 0;
while isFound do
begin
if ( sRec.Name <> ‘.’ ) and ( sRec.Name <> ‘..’ ) then
begin
if ( sRec.Attr and faDirectory ) = faDirectory then
AllFiles2one( Path + ‘\’ + sRec.Name, path2) else
begin
//form1.Caption:=Path + ‘\’ + sRec.Name; // раскомментируйте для того чтобы можно было следить за процессом выполнения. Хотя следить можно просто мониторя вес итоговой папки и сравнивая с начальной.
CopyFile(Pchar( Path + ‘\’ + sRec.Name ), Pchar( Path2 + ‘\’ + StringReplace( StringReplace(Path,’:\’,’_’,[]) + ‘_’ + sRec.Name,’\’,’_’,[rfReplaceAll] )),true);
end;
end;
Application.ProcessMessages;
isFound := FindNext( sRec ) = 0;
end;
FindClose( sRec );
end;
Сначала хотел обрезать путь до файла и так и копировать, но понял что туплю, потому что некоторые файлы могут иметь одно имя, и поэтому в процедуре каждый выходной файл имеет адрес своего пути. Переименовать их в обычные числа вы сможете вот этой моей прогой.
Процедура принимает входные данные:
Path — главный адрес с которого начать читать дерево.
Path2 — папка куда копировать.
!!ВНИМАНИЕ. ПРОЦЕДУРА КОПИРУЕТ ФАЙЛЫ, СЛЕДОВАТЕЛЬНО УЧИТЫВАЙТЕ ЭТО ОБРАБАТЫВАЯ БОЛЬШИЕ КАТАЛОГИ!!
Автор: Elsper.ru
я бы создал симлинки.