我正在编写一个可以在网络共享上复制文件的应用程序。通常文件在同一个物理硬盘驱动器上移动。如果您使用 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 界面。
亲切的问候