Проблема с производительностью при перемещении файлов на сетевых ресурсах - PullRequest
0 голосов
/ 10 августа 2010

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

I 'Я использую Windows 7 в моей системе разработки, но она также должна работать на XP, поэтому я не могу использовать новый интерфейс IFileOperation.

С уважением

1 Ответ

1 голос
/ 10 августа 2010

Я бы проигнорировал функции API оболочки и использовал бы MoveFileEx или MoveFileWithProgress напрямую.

...