Я выполняю xcopy
резервное копирование диска в Windows с помощью следующей командной строки:
xcopy "d:" "r:" /v /h /k /e /b /d
Я знаю что проверить переключатель мало что делает, но сравнение размеров файлов для начальной копии лучше, чем ничего.
У меня проблема в том, что xcopy
выдает ошибку проверки файла, и я не знаю почему. Рассматриваемый файл является символической ссылкой, и файл, на который она указывает, уже существует.
У меня есть Cygwin, и я запустил оба diff
, diff --no-dereference
, и cmp
на обеих ссылках, а также на самом файле, на который он указывает на обоих дисках, без разницы.
Оба файла имеют размер ровно 73 байта.
Я не могу воспроизвести это, создав тестовую папку с действительными или недействительными ссылками при использовании xcopy
с одинаковыми параметрами для выполнения копирования на одном или разных дисках.
Почему бы xcopy
потерпеть неудачу таким образом?
2 ответа
Xcopy не записывает размер файла при копировании символической ссылки, но этап проверки не знает о символических ссылках и все равно пытается сравнить размер целевого файла с (неустановленной) записью.
Это можно наблюдать с помощью Sysinternals. Монитор процесса. Лучше всего скопировать только один файл за раз и начать регистрацию событий ввода-вывода файла только из xcopy.exe
после того, как Xcopy спросит вас, является ли адресат каталогом, но до того, как вы ответите — таким образом вы пропустите все операции ввода-вывода при запуске процесса. когда /B
пройден, Xcopy устанавливает параметр «Открыть точку повторной обработки» в CreateFile
операция, которая открывает исходный файл, сообщая Windows, что если файл оказывается символической ссылкой (точкой повторной обработки), она хочет открыть саму символическую ссылку, а не целевой файл. Позже, после создания файла назначения, установки его как символической ссылки и перетасовки некоторых атрибутов файла, если /V
пройдено, Xcopy выдает другое CreateFile
, чтобы снова открыть целевой файл, но без параметра «Открыть точку повторной обработки». Если это символическая ссылка, результатом будет REPARSE
и Windows фактически открывает целевой файл для Xcopy сразу после CreateFile
операция. Вскоре Xcopy выполняет QueryStandardInformationFile
операция, получая размер файла, который он считал местом назначения. Но, оглядываясь назад, мы напоминаем себе, что нет QueryStandardInformationFile
операция с / через исходный файл выполнялась ранее для сравнения размера файла с. Напротив, если вы отслеживаете Xcopy обычного файла (даже с /B
) вы увидите QueryStandardInformationFile
операция с исходным файлом вскоре после его открытия с помощью CreateFile
.
В подтверждение этой гипотезы Xcopy мочь скопируйте и успешно проверьте символическую ссылку на файл с нулевым байтом. По-видимому, запись размера файла инициализирована нулем, поэтому, даже если он не установлен при копировании символической ссылки, когда проход проверки вслепую открывает цель скопированной символической ссылки, чтобы получить ее размер, нулевой ответ соответствует нулю по умолчанию.
В /v
опция проверяет каждый файл в том виде, в котором он написан, на основе его размера, чтобы убедиться, что они идентичны.
Проверка была встроена в xcopy
команда, начинающаяся в Windows XP, но не должна делать ничего в более поздних версиях Windows. Он включен только для совместимости со старыми файлами MS-DOS.
Неудивительно, что этот древний код проверки не работает с новой функцией, такой как символические ссылки.
Я бы рекомендовал не использовать xcopy
если у вас есть символические ссылки. Используйте более современное приложение, которое может выполнять проверку, например
TeraCopy.