.NET Directory.Move() против File.Move()

У нас есть приложение, которое хранит файлы во временном местоположении, пока пользователь не решит завершить свою транзакцию. Временный каталог уникален для каждой транзакции. Как только они завершают работу, файлы перемещаются из временного местоположения в конечное местоположение, которое также является уникальным для каждой транзакции. Это все работает без проблем.

Я довольно удивлен, но при поиске в Google и SO мы не смогли найти ни одной темы, которая обычно считается лучшей практикой:

  1. Вызовите System.IO.Directory.Move(src, des), чтобы просто переместить весь каталог сразу, или
  2. Вызовите System.IO.File.Move(src, des), чтобы переместить файлы по одному.

Поскольку эти решения обычно зависят от ряда факторов, я должен отметить следующие условия:

  1. Каталоги источника и назначения всегда будут находиться на одном компьютере, но приложение, выполняющее вызовы, будет находиться на другом компьютере в той же сети. Я считаю, что сервер приложений и файловый сервер - это отдельные виртуальные машины на одной физической машине, но я не уверен.
  2. Количество файлов может варьироваться от 1 до 10 или более. Я не слежу за производственной системой самостоятельно, поэтому не уверен в среднем числе файлов или в том, насколько распространено это количество.

2 ответа

Решение

Я думаю, что самая большая проблема не в скорости, а скорее: что происходит при ошибке движения?

Я собираюсь использовать информацию в ответе LukeH, а не повторять ее здесь.

Поведение MoveFile для перемещения каталога должно быть целесообразно, если не удается переместить один файл. Если вы используете перемещение каждого файла, то вы должны самостоятельно обработать условия ошибки соответствующим образом. Это требует некоторых тщательных размышлений.

Обратите внимание, что документация MoveFile указывает, что:

Единственное предостережение в том, что функция MoveFile не будет работать при перемещении каталогов, когда место назначения находится на другом томе.

Это может или не может быть проблемой для вас и причиной для использования перемещения файла. Directory.Move документация явно упоминает об этом (и справочный источник для Directory.Move явно проверяет источник и назначение, имеющие одинаковый корень).

Я не уверен, есть ли какая-либо фиксированная "лучшая практика", кроме того, что вы должны использовать наиболее подходящий инструмент для работы.

Поскольку то, что вы делаете, это перемещение всего каталога из его временного местоположения / статуса в постоянное местоположение / статус, я бы предложил использовать Directory.Move, Это означает, что ваш код будет более явно отражать ваши логические намерения.


И если вас больше беспокоит техническое различие между этими двумя методами...

В версии Microsoft.NET оба Directory.Move а также File.Move в конце концов взывать к Win32 MoveFile или же MoveFileEx функции. Вы можете подтвердить это, посмотрев на справочный источник:

  • Directory.Move -> Directory.InternalMove -> Win32Native.MoveFile
  • File.Move -> File.InternalMove -> Win32Native.MoveFile

Имея это в виду, кажется вероятным, что MoveFile один раз (через Directory.Move) было бы предпочтительнее, чем вызывать его много раз для каждой транзакции (через File.Move).

Другие вопросы по тегам