0

我正在编写一个可以在网络共享上复制文件的应用程序。通常文件在同一个物理硬盘驱动器上移动。如果您使用 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 Explorer 使用了不同的 API 函数?

做一个简短的比较:

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

我在我的开发系统上使用 Windows 7,但它也应该在 XP 上工作,所以我不能使用新的 IFileOperation 界面。

亲切的问候

4

1 回答 1

1

我会忽略shell API函数,直接使用MoveFileExor MoveFileWithProgress

于 2010-08-10T14:09:48.957 回答