Можно использовать статических конструкторов в .NET, но к сожалению они не делают то, что Вы хотите. Статические конструкторы только выполняются непосредственно перед тем, как тип используется. См. http://msdn.microsoft.com/en-us/library/k9x6w0hc (По сравнению с 80) .aspx для деталей.
Вы могли бы получить некоторый пробег от подписки до события AssemblyLoad Вашего AppDomain. См. http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx .
В Вашем обработчике событий Вы могли размышлять над недавно загруженным блоком и заставить его выполнять безотносительно кода, который Вы любите.
Определенно используйте 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;
Эта функция вызовет запрос на перезапись существующих файлов (возможно, ее можно настроить, чтобы пропустить это), но пользователь может выбрать «Все», так что это процедура в один клик, намного быстрее , имеет индикатор выполнения и может быть отменен при желании.
Вы можете использовать вызов API SHFileOperation ()
и использовать подстановочный знак в имени файла структуры. Таким образом, можно было бы использовать один вызов для копирования всех файлов за один раз. Есть даже возможность показать прогресс (с помощью функции обратного вызова) и позволить пользователю отменить операцию.
Возможно, вы могли бы поэкспериментировать с чтением группы файлов в память и последующей записью их всех на диск сразу (например, XCOPY). Это могло бы быть лучше для файловой системы.
Я не могу сейчас протестировать ваш код, но посмотрите эту исправленную версию
// (!) 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;