在我的应用程序中,我需要复制超过1000个小文件
procedure TdataFeeds.RestotreTodaysFiles; var SearchRec: TSearchRec; FromFn,ToFn: string; Begin if DirectoryExists(BackupPath1) then begin try if FindFirst(BackupPath1 + '\*.*',(faAnyFile AND NOT(faDirectory)),SearchRec) = 0 then begin repeat FromFn := BackupPath1 + '\' + SearchRec.name; ToFn := DataFeedsPath1 + '\' + SearchRec.name; CopyFile(Pchar(FromFn),Pchar(ToFn),false); until FindNext(SearchRec) <> 0; end; finally FindClose(SearchRec); end; end; End;
解决方法
绝对按照上面的建议使用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;
这个函数会提示覆盖现有文件的提示(也许可以调整以跳过它),但用户可以选择“全部”,这样它只需一次点击程序,速度更快,有进度条,如果需要可以取消.