Скопируйте все из исходного каталога в новый каталог Delphi EX7

Моя конечная цель - скопировать все соответствующие файлы из одной папки в другую. Так, например. у нас есть C:\Users\Tool\Desktop\test\oldStuff. В папке oldStuff у нас есть еще папки, а также несколько файлов mp3, mp4 и txt.

Теперь я хотел бы скопировать все файлы mp4 размером менее 1 ГБ в C:\Users\Tool\Desktop\test\New_Stuff_Less_than_a_Gig и файлы .mp4 размером более 1 ГБ в C:\Users\Tool\Desktop\test\New_STuff_Bigger_than_a_Gig.

Я хотя это было бы довольно легко, но я был неправ. Пока что это так, пока не беспокоился о типе файла, поэтому просто сделал это *.*

 procedure TForm4.Button1Click(Sender: TObject);
 var
   f: TSearchRec;
   Dir: string;
 begin
    if not SelectDirectory(Dir,widestring(Dir),Dir) then   Exit;
    FileMode:=0;
    if FindFirst(Dir+'\*.*',faAnyFile,f) = 0 then
    repeat
         try
          if (f.Attr and faDirectory ) < $00000008 then
          CopyFile(PChar(Dir+'\'+f.Name),PChar
 ('C:\Users\Tool\Desktop\test\new\'+f.Name),false);
         except
          on e: exception do
            ShowMessage(E.Message);
         end;
    until findNext(f) <> 0
 end;

который скопирует что-либо в выбранную папку, но ничего не скопирует из папок в выбранной папке. Например. если у нас есть C:\Users\Tool\Desktop\test\oldStuff\movie.mp4, он скопирует файл Movie.mp4, но если у нас есть C:\Users\Tool\Desktop\test\oldStuff\movies\Movie.mp4, он не скопирует файл Movie.mp4. Я, хотя я мог бы просто сделать что-то вроде этого

CopyFile.size < 1000 (PChar('C:\Users\Tool\Desktop\test\oldStuff\*.*'+f.Name),
                   PChar('C:\Users\Tool\Desktop\test\new_Stuff\'+f.Name),false)

или даже просто

CopyFile (PChar('C:\Users\Tool\Desktop\test\old\*.*'+f.Name),
                   PChar('C:\Users\Tool\Desktop\test\new\'+f.Name),false);

но ничего не копировал.


person Studying.com    schedule 21.03.2015    source источник
comment
SHFileOperation или IFileOperation. Встаньте на вершину системы.   -  person David Heffernan    schedule 21.03.2015
comment
FWIW, в вашем коде много ошибок. Начиная с смешивания кода графического интерфейса и копирования файлов в одной функции. Продолжение с отсутствием проверки ошибок, ошибочной проверкой атрибутов и неудачно размещенным обработчиком исключений.   -  person David Heffernan    schedule 21.03.2015
comment
Привет, Дэвид. Спасибо, что скоро загляну в Google и посмотрю, что у меня получится, спасибо за внимание. @DavidHeffernan   -  person Studying.com    schedule 21.03.2015
comment
Я откатил вашу правку. Вы не можете изменить весь вопрос после того, как получили на него ответы. Если теперь у вас есть другой вопрос о совершенно другом подходе, создайте новый вопрос и задайте его там.   -  person Ken White    schedule 22.03.2015
comment
Удалите * в обоих местах, где вы используете SameText. Их нет в моем коде в моем ответе, и они не принадлежат вашему. *.txt не является допустимым расширением файла, а ExtractFileExt возвращает расширение файла. *.txt никогда не будет тем же текстом, что и *.txt, потому что это разные тексты.   -  person Ken White    schedule 22.03.2015
comment
Или, что еще лучше, обновите его, чтобы использовать текущую версию моего кода, что вообще устраняет необходимость использовать расширение внутри этого теста.   -  person Ken White    schedule 22.03.2015


Ответы (1)


Вот пример (сделанный в XE7), который будет делать то, что вы хотите. Очевидно, вам нужно будет изменить его в соответствии с вашими потребностями; он имеет жестко закодированную информацию о пути и маске файла (*.png) и использует константу, чтобы решить, является ли файл большим или маленьким.

Он основан на этом образце дерева каталогов:

D:\TempFiles
  |--\Test
  |-----\A
  |-----\B
  |--------\SubB   
  |-----\NewFiles
  |-------\Large
  L-------\Small

Он находит все файлы .png в папке D:\TempFiles\Test и ее подпапках и копирует файлы размером более 10 КБ в D:\ TempFiles\NewFiles\Large и меньше 10 КБ в D:\TempFiles\NewFiles\Small.

Вам нужно будет добавить IOUtils и Types в предложение реализации uses.

procedure TForm1.Button1Click(Sender: TObject);
var
  aLargeFiles: TStringDynArray;
  aSmallFiles: TStringDynArray;
const
  LargeSize = 10 * 1024;
  SourcePath = 'D:\TempFiles\Test\';
begin
  aLargeFiles := TDirectory.GetFiles(SourcePath, '*.png',
                   TSearchOption.soAllDirectories,
                   function (const Path: string; const SR: TSearchRec): Boolean
                   begin
                     Result := (SR.Size >= LargeSize);
                   end);
  aSmallFiles := TDirectory.GetFiles(SourcePath, '*.png',
                   TSearchOption.soAllDirectories,
                   function(const Path: string; const SR: TSearchRec):Boolean
                   begin
                     Result := (SR.Size < LargeSize);
                   end);
  CopyFilesToPath(aLargeFiles, 'D:\TempFiles\NewFiles\Large\');
  CopyFilesToPath(aSmallFiles, 'D:\TempFiles\NewFiles\Small\');
end;

procedure TForm1.CopyFilesToPath(aFiles: array of string; DestPath: string);
var
  InFile, OutFile: string;
begin
  for InFile in aFiles do
  begin
    OutFile := TPath.Combine( DestPath, TPath.GetFileName( InFile ) );
    TFile.Copy( InFile, OutFile, True);
  end;
end;
person Ken White    schedule 21.03.2015
comment
ОП также попросил скопировать файлы из подпапок, но этот код не повторяется ни в каких подпапках. - person Remy Lebeau; 21.03.2015
comment
@Remy: переписано для использования подкаталогов TDirectory.GetFiles и recurse. - person Ken White; 21.03.2015
comment
Привет, Кен, не знаю почему, но {CopyFilesToPath} возвращается как необъявленный идентификатор. немного поиграю с ним и постараюсь добавить к тому, что у меня уже есть. @КенУайт - person Studying.com; 21.03.2015
comment
Это прямо в коде, который я разместил - вы можете прочитать его сами. Вам нужно добавить его как метод формы (щелкните по нему и нажмите Ctrl+Shift+C или добавьте его в объявление формы вручную. - person Ken White; 21.03.2015
comment
Привет, спасибо, Кен, я добавил его вручную. теперь он говорит 's' в OutFile := ExtractFileName(s); является необъявленным идентификатором. - person Studying.com; 21.03.2015
comment
Была только небольшая ошибка с использованием неправильной переменной. Я только что исправил это и изменил все, чтобы использовать инструменты из IOUtils. - person Sir Rufo; 22.03.2015
comment
Привет, Руфо, спасибо, но он не копирует =( ... Завтра я буду больше гуглить. Спасибо за всю помощь, ребята, многому научились. @SirRufo - person Studying.com; 22.03.2015
comment
@Chewy: код действительно копируется. Я протестировал его перед публикацией, и он правильно скопировал файлы в мои тестовые каталоги, как я объяснил в своем ответе. Если это не работает для вас, вы сделали что-то не так. - person Ken White; 22.03.2015
comment
@Chewy: Мой код копируется нормально, если вы удалите две введенные вами ошибки, как я объяснил в своем комментарии к вашему вопросу. - person Ken White; 22.03.2015
comment
Привет, спасибо, Кен работает как сон, большое спасибо за помощь, у меня нет представителя, чтобы дать вам ответ. Мне немного стыдно, что я застрял на стольких простых вопросах и нуждался в помощи в таких мелочах. я занят поиском всех функций, которые вы вызвали. - person Studying.com; 22.03.2015
comment
На самом деле, да. Вы можете принять ответы на свой вопрос, даже с нулевым повторением. На самом деле вы делали это раньше. - person Ken White; 22.03.2015
comment
Спасибо, Кен, я принял ваш ответ и отредактировал свой пост обратно к исходному вопросу. жаль менять. @КенУайт - person Studying.com; 05.04.2015