1

Я использую .bat, содержащий:

robocopy \\server\directory\ .\localdir /MIR

Это перемещает один файл с сервера в мой локальный каталог.

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

В какой момент файл будет перезаписан? Могу ли я выйти из нее и использовать файл, который находился в \localdir до запуска .bat? Или мне нужно дождаться окончания робокопии?

1 ответ1

1

robocopy ничем не отличается от любой другой программы копирования файлов. Перезаписывающая копия "обрезает" существующие данные в файле, а затем начинает запись новых данных. Это можно наблюдать с помощью программы, которая отслеживает системные API-интерфейсы, вызываемые robocopy, например, одну из перечисленных здесь опций. Тогда вам нужно только просмотреть каждый вызов API на MSDN, чтобы точно понять, что происходит.

Сначала он вызывает SetFilePointerEx для поиска начала файла (если его там еще нет). Затем он вызывает SetEndOfFile, чтобы обрезать файл до маркера BOF (делая его нулевым байтом). Все это происходит так быстро, что эффективно, как только эта команда начинает выполняться, ваши исходные данные файла "теряются" для всех намерений и целей (блоки, которые представляли поток данных файла, очень скоро будут полностью или частично перезаписаны будущей записью NTFS команд).

Если вы хотите сделать это "атомарно", вы можете выполнить операцию переименования, например:

  1. Скопируйте содержимое файла (используя robocopy) с сервера на уникальный путь в вашей локальной системе, который в настоящее время НЕ существует (например, если файл называется foo , вы можете скопировать его в foo.bak .)

  2. Выполните перезаписывающее переименование с помощью функции атомарного переименования Windows API, которая была добавлена в Windows Vista (и поэтому не поддерживается в XP и более ранних версиях, для которых требуется неатомарное , возможно, с ошибками или сломанное, неатомарное переименование; оу): MoveFileTransacted () , Таким образом, вы можете мгновенно "поменять" данные, содержащиеся в файле, от содержимого исходного файла до содержимого нового файла. Это означает, что любая программа не может прочитать частично полный файл - либо она читает (полную, неизмененную) оригинальную копию, либо читает полную, неизмененную обновленную копию. Он никогда не прочитает "неполную" копию или искаженную комбинацию обоих файлов.

Недостатки этого альтернативного метода:

  • Я не знаю программу, которая уже делает это из коробки;
  • Поскольку у вас есть исходный файл, пока вы делаете свою копию, вам нужно в два раза больше памяти. Поэтому, если вы собираетесь перезаписать файл размером 1 ГБ другим файлом размером 1 ГБ, вам потребуется всего 2 ГБ памяти в локальной системе, хотя и временно.
  • Работает только с транзакционной NTFS. Это означает, что если исходная файловая система или файловая система назначения для перезаписи транзакции не является NTFS, она не будет работать. Вы по-прежнему можете выполнить повторную копирование файла из общего сетевого ресурса в локальную систему, но атомарное переименование не будет работать на общем сетевом ресурсе или (если они не добавят его в будущем) на ReFS, которая может когда-нибудь стать нашей файловой системой по умолчанию, например NTFS сделал более FAT32 лет назад.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .