Разница между копированием / удалением файлов и перемещением - PullRequest
12 голосов
/ 08 июля 2011

В чем разница между

  1. Копирование файла и его удаление с использованием File.Copy() и File.Delete()
  2. Перемещение файла с использованием File.Move()

С точки зрения разрешения, необходимого для выполнения этих операций, есть ли разница? Любая помощь высоко ценится.

Ответы [ 4 ]

8 голосов
/ 08 июля 2011

Метод File.Move может использоваться для перемещения файла из одного пути в другой.Этот метод работает с дисковыми томами и не выдает исключение, если источник и место назначения совпадают.

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

3 голосов
/ 08 июля 2011

Производительность, если в одной и той же файловой системе перемещение файла - это (в упрощенном виде) просто настройка некоторых внутренних регистров самой файловой системы (возможно, настройка некоторых узлов в красное / черное дерево ), фактически ничего не двигая.

Представьте, что у вас есть 180 МБ для перемещения, и вы можете записывать на диск со скоростью примерно 30 МБ / с.Затем с копированием / удалением требуется приблизительно 6 секунд, чтобы закончить.С помощью простого перемещения [той же файловой системы], оно идет так быстро, что вы даже не осознаёте этого.

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

0 голосов
/ 08 июля 2011

Разрешение при передаче файла проверяется в двух точках: источник и пункт назначения. Таким образом, если у вас нет разрешения read в исходной папке или у вас нет разрешения write в месте назначения, оба эти метода выдают исключение AccessDeniedException. Другими словами, проверка разрешений не зависит от используемого метода.

0 голосов
/ 08 июля 2011

Я не думаю, что есть какие-либо различия в разрешениях, но я бы лично предпочел использовать File.Move (), так как тогда оба действия происходят в одной и той же «транзакции».Другими словами, если что-то на ходу терпит неудачу, вся операция терпит неудачу.Однако, если вы разбили его на два этапа (копирование + удаление), если копирование сработало, а удаление не удалось, вам придется вручную отменить «транзакцию» (удалить копию) вручную.

...