Проблема производительности при перемещении файлов на сетевые акции

StackOverflow https://stackoverflow.com/questions/3449803

Вопрос

Я пишу приложение, которое может копировать файлы на долю сети. Обычно файлы перемещаются на одном и том же физическом жестком диске. Если вы проверяете это с 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 напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top