.NET Directory.Move() против File.Move()
У нас есть приложение, которое хранит файлы во временном местоположении, пока пользователь не решит завершить свою транзакцию. Временный каталог уникален для каждой транзакции. Как только они завершают работу, файлы перемещаются из временного местоположения в конечное местоположение, которое также является уникальным для каждой транзакции. Это все работает без проблем.
Я довольно удивлен, но при поиске в Google и SO мы не смогли найти ни одной темы, которая обычно считается лучшей практикой:
- Вызовите System.IO.Directory.Move(src, des), чтобы просто переместить весь каталог сразу, или
- Вызовите System.IO.File.Move(src, des), чтобы переместить файлы по одному.
Поскольку эти решения обычно зависят от ряда факторов, я должен отметить следующие условия:
- Каталоги источника и назначения всегда будут находиться на одном компьютере, но приложение, выполняющее вызовы, будет находиться на другом компьютере в той же сети. Я считаю, что сервер приложений и файловый сервер - это отдельные виртуальные машины на одной физической машине, но я не уверен.
- Количество файлов может варьироваться от 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
).