Я пишу приложение, которое может копировать файлы в сетевом ресурсе. Обычно файлы перемещаются на один и тот же физический жесткий диск. Если вы проверите это с помощью проводника 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);
К сожалению, этот код выполняет «копирование и удаление», что намного медленнее для больших файлов или если у вас много файлов. Как я могу этого избежать? Есть ли способ сообщить операции перемещения, что папки находятся на одном жестком диске? Возможно, есть какое-то другое обозначение сетевого пути.
Или есть другая функция API, которая используется Проводником Windows?
Для краткого сравнения:
- количество файлов : 260
- размер файла для каждого из файлов: 11 кБ
- время перемещения в Проводнике: 2 сек.
- время перемещения с помощью SHFILEOPERATION : 20 сек.
Я использую Windows 7 в своей системе разработки, но она также должна работать на XP, поэтому я не могу использовать новый интерфейс IFileOperation.
С уважением