我正在写一个应用程序,它可以复制文件上的一个网络分享。通常的文件移到相同物理的硬盘驱动器。如果你的测试这个Windows资源管理器,这种操作将是执行真的很快。现在看来,这Windows知道关于同一位置,并且不会一个真正的运动并不是一个副本,并删除(这将是速度较慢).

让我们说你想要复制一组文件:

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

目的是例如:

\\computer\share\subfolder

该应用程序使用的Windows壳API(I写的应用程序在德尔斐,但是问题应该以相同于其他语言):

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);

不幸的是,这个代码做一个"复制,并删除"其速度慢得多大的文件,或者如果你有很多的文件。我如何可以避免这种情况?是否有任何方式来告诉移动操作,文件夹是在同一个硬盘驱动器?也许还有其他一些符号表示网络的道路。

或者是有一个不同的API function其是使用通过窗户浏览器?

对于一个短暂的比较:

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

我使用的Windows7月,我的发展系统,但它也应该在工作XP,因此我不能使用的新IFileOperation接口。

亲切的问候

有帮助吗?

解决方案

我会忽略壳API功能,和使用 MoveFileExMoveFileWithProgress 直接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top