Проблема производительности при перемещении файлов на сетевые акции
-
27-09-2019 - |
Вопрос
Я пишу приложение, которое может копировать файлы на долю сети. Обычно файлы перемещаются на одном и том же физическом жестком диске. Если вы проверяете это с Windows Explorer, эта операция будет выполнена очень быстро. Похоже, что Windows знает о том же месте и делает реальное движение, а не копию и удаление (которая будет медленнее).
Допустим, вы хотите скопировать набор файлов:
\\computer\share\fileA.txt
\\computer\share\fileB.txt
Место назначения является например:
\\computer\share\subfolder
Приложение использует API Windows Shell (я написал приложение в 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 Explorer?
Для короткого сравнения:
- Количество файлов: 260
- Размер файла для каждого из файлов: 11 КБ
- Время для перемещения в исследователь: 2 сек
- Время движения с помощью Shfileoperation: 20 сек
Я использую Windows 7 в моей системе развития, но он также должен работать на XP, поэтому я не могу использовать новый интерфейс ifileoperation.
С уважением
Решение
Я бы игнорировал функции API Shell и использовать MoveFileEx
или MoveFileWithProgress
напрямую.