6

在我的应用程序中,我需要复制 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;
4

4 回答 4

10

绝对按照上面的建议使用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;

此功能将提示覆盖现有文件(也许可以调整以跳过该文件),但用户可以选择“全部”,因此它是一个单击程序,速度更快,有一个进度条,如果需要可以取消.

于 2009-10-19T13:15:03.400 回答
7

您可以使用SHFileOperation()API 调用并在结构的文件名中使用通配符。这样一来,一个调用就可以一次复制所有文件。甚至可以显示进度(通过回调函数)并允许用户取消操作。

于 2009-10-19T12:41:19.113 回答
2

我现在无法测试您的代码,但请查看此更正版本

    // (!) 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;
于 2009-10-19T12:55:44.637 回答
0

也许您可能会尝试将一堆文件读入内存,然后一次将它们全部写入磁盘(如 XCOPY)。这在文件系统上可能会更好。

于 2009-10-19T12:41:09.477 回答