Копирование большого количества файлов в Delphi

Можно использовать статических конструкторов в .NET, но к сожалению они не делают то, что Вы хотите. Статические конструкторы только выполняются непосредственно перед тем, как тип используется. См. http://msdn.microsoft.com/en-us/library/k9x6w0hc (По сравнению с 80) .aspx для деталей.

Вы могли бы получить некоторый пробег от подписки до события AssemblyLoad Вашего AppDomain. См. http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx .

В Вашем обработчике событий Вы могли размышлять над недавно загруженным блоком и заставить его выполнять безотносительно кода, который Вы любите.

6
задан Jim McKeeth 27 October 2009 в 16:16
поделиться

4 ответа

Определенно используйте SHFileOperation () , как предлагалось выше, CopyFile слишком медленный для такого количества файлов. Похоже, вы в основном восстанавливаете всю папку, поэтому функция поиска может быть ненужной и еще больше замедлить работу. Что-то вроде этого может помочь:

uses ShellApi;

function CopyDir(const fromDir, toDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_COPY;
    fFlags := FOF_FILESONLY;
    pFrom  := PChar(fromDir + #0);
    pTo    := PChar(toDir)
  end;
  Result := (0 = ShFileOperation(fos));
end;

Эта функция вызовет запрос на перезапись существующих файлов (возможно, ее можно настроить, чтобы пропустить это), но пользователь может выбрать «Все», так что это процедура в один клик, намного быстрее , имеет индикатор выполнения и может быть отменен при желании.

10
ответ дан 8 December 2019 в 12:21
поделиться

Вы можете использовать вызов API SHFileOperation () и использовать подстановочный знак в имени файла структуры. Таким образом, можно было бы использовать один вызов для копирования всех файлов за один раз. Есть даже возможность показать прогресс (с помощью функции обратного вызова) и позволить пользователю отменить операцию.

7
ответ дан 8 December 2019 в 12:21
поделиться

Возможно, вы могли бы поэкспериментировать с чтением группы файлов в память и последующей записью их всех на диск сразу (например, XCOPY). Это могло бы быть лучше для файловой системы.

0
ответ дан 8 December 2019 в 12:21
поделиться

Я не могу сейчас протестировать ваш код, но посмотрите эту исправленную версию

    // (!) faAnyFile-faDirectory <--- this is wrong
    // we don't subtract flag values because the value will be meaningless
    if FindFirst(BackupPath1 + '\*.*', faAnyFile, SearchRec) = 0 then
    begin
      repeat
        if  not (SearchRec.Attr and faDirectory)
            And SearchRec.Name <> "."
            And SearchRec.Name <> ".." Then
        Begin
          FromFn := BackupPath1 + '\' + SearchRec.name;
          ToFn := DatafeedsPath1 + '\' + SearchRec.name;
          CopyFile(Pchar(FromFn), Pchar(ToFn), false);
        End;
      until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
2
ответ дан 8 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: