移动网络共享上的文件时出现性能问题

时间:2010-08-10 14:05:30

标签: delphi shell32 network-shares shfileoperation

我正在编写一个可以复制网络共享上的文件的应用程序。通常,文件在同一物理硬盘上移动。如果使用Windows资源管理器对此进行测试,则此操作将非常快速地执行。看起来,Windows知道相同的位置并进行真正的移动,而不是复制和删除(这会更慢)。

假设您要复制一组文件:

\\computer\share\fileA.txt
\\computer\share\fileB.txt

目的地是例如:

\\computer\share\subfolder

该应用程序使用Windows Shell API(我在Delphi中编写了应用程序,但问题也应该与其他语言相同):

with SHFileOpStruct do
  begin
  Wnd := 0;
  wFunc := FO_MOVE;
  pFrom := PChar ('\\computer\share\fileA.txt'+#0 
                  +'\\computer\share\fileB.txt'+ #0#0);
  pTo   := PCahr ('\\computer\share\subfolder' + #0#0);
  fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
  end;

Result := SHFileOperationW (SHFileOpStruct);

不幸的是,这段代码执行“复制和删除”,这对大文件或者如果你有很多文件要慢得多。我怎么能避免这个?有没有办法告诉移动操作,文件夹是在同一个硬盘上?也许网络路径还有其他一些表示法。

或者是否有Windows资源管理器使用的不同API函数?

进行简短比较:

  • 文件数量:260
  • 每个文件的文件大小:11 kB
  • 在资源管理器中移动的时间:2秒
  • 使用SHFILEOPERATION移动的时间:20秒

我在我的开发系统上使用Windows 7,但它也适用于XP,因此我无法使用新的IFileOperation接口。

亲切的问候

1 个答案:

答案 0 :(得分:1)

我会忽略shell API函数,并直接使用MoveFileExMoveFileWithProgress