2

У меня есть файл DWA_160_drv_RevB_2_2-42_all_en_20130313.zip на рабочем столе. Я хочу скопировать его на флешку с помощью CMD. Для этого я использую команду copy, но получаю странные результаты, т.е. исходный файл составляет около 30 тысяч (!!) раз больше, чем новый файл.

C:\Users\Sam\Desktop>
C:\Users\Sam\Desktop>dir dwa*
 Volume in drive C is Vista (ST1PT1)
 Volume Serial Number is D27C-,,,,

 Directory of C:\Users\Sam\Desktop

2013-10-10  11:56        23 324 179 DWA_160_drv_RevB_2_2-42_all_en_20130313.zip
               1 File(s)     23 324 179 bytes
               0 Dir(s)   3 318 292 480 bytes free

C:\Users\Sam\Desktop>copy dwa* d:\dwa-driver.zip
DWA_160_drv_RevB_2_2-42_all_en_20130313.zip
        1 file(s) copied.

C:\Users\Sam\Desktop>d:

D:\>dir
 Volume in drive D is CRUZER
 Volume Serial Number is 0085-,,,,

 Directory of D:\

2013-10-10  13:41               734 dwa-driver.zip
               1 File(s)            734 bytes
               0 Dir(s)   2 050 744 320 bytes free

D:\>

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

Я что-то здесь не так делаю?

Я подумал, что это может быть связано с тем, как я печатаю исходный и целевой путь поиска, поэтому я добавил кавычки. Я не могу сказать, что это помогло.

D:\>c:

C:\Users\Sam\Desktop>copy "dwa*" "d:\dwa-driver.zip"
DWA_160_drv_RevB_2_2-42_all_en_20130313.zip
Overwrite d:\dwa-driver.zip? (Yes/No/All):
        0 file(s) copied.

C:\Users\Sam\Desktop>d:

D:\>c:

C:\Users\Sam\Desktop>copy "dwa*" "d:\dwa-driver.zip"
DWA_160_drv_RevB_2_2-42_all_en_20130313.zip
Overwrite d:\dwa-driver.zip? (Yes/No/All): y
        1 file(s) copied.

C:\Users\Sam\Desktop>d:

D:\>dir
 Volume in drive D is CRUZER
 Volume Serial Number is 0085-,,,,

 Directory of D:\

2013-10-10  13:56               734 dwa-driver.zip
               1 File(s)            734 bytes
               0 Dir(s)   2 050 744 320 bytes free

D:\>

Поэтому я решил попробовать использовать полное имя исходного файла, используя функцию автозаполнения в CMD, чтобы убедиться, что он введен правильно. И на этот раз это сработало! Вот команда.

D:\>c:

C:\Users\Sam\Desktop>copy DWA_160_drv_RevB_2_2-42_all_en_20130313.zip d:\dwa-d
river2.zip
        1 file(s) copied.

C:\Users\Sam\Desktop>d:

D:\>dir
 Volume in drive D is CRUZER
 Volume Serial Number is 0085-,,,,

 Directory of D:\

2013-10-10  13:56               734 dwa-driver.zip
2013-10-10  11:56        23 324 179 dwa-driver2.zip
               2 File(s)     23 324 913 bytes
               0 Dir(s)   2 027 417 600 bytes free

D:\>

Так что на этот раз это сработало!?!? Чем dwa-driver2.zip отличается от dwa-driver.zip? И как оригинальный файл - DWA_160_drv_RevB_2_2-42_all_en_20130313.zip - сравнить с dwa-driver.zip? Чтобы ответить на это, я сделал параллельное текстовое и шестнадцатеричное сравнение. Смотрите скриншоты ниже.

Что именно происходит в строке 6? Почему он без проблем копирует первые 5 строк, а затем застревает в строке 6 (см. Скриншот WinMerge)? Оба файла идентичны, вплоть до строки 6, и с этого момента данные больше не копируются в новый файл. Зачем? Разрешено ли использовать подстановочные знаки с командой копирования?

Обновить


Я просто назову это ошибкой и использую команду xcopy, потому что она принимает все, что я на нее брошу. Неважно, есть ли символы подстановки или нет. К сожалению, команда xcopy доступна не во всех режимах Windows и окнах командной строки.

D:\>c:

C:\Users\Sam\Desktop>xcopy dwa* d:\dwa-driver3.zip
Does D:\dwa-driver3.zip specify a file name
or directory name on the target
(F = file, D = directory)? f
C:DWA_160_drv_RevB_2_2-42_all_en_20130313.zip
1 File(s) copied

C:\Users\Sam\Desktop>d:

D:\>dir
 Volume in drive D is CRUZER
 Volume Serial Number is 0085-,,,,

 Directory of D:\

2013-10-10  13:56               734 dwa-driver.zip
2013-10-10  11:56        23 324 179 dwa-driver2.zip
2013-10-10  11:56        23 324 179 dwa-driver3.zip
               3 File(s)     46 649 092 bytes
               0 Dir(s)   2 004 090 880 bytes free

D:\>

Скриншоты


Нажмите для увеличения.

Сравнение текста между DWA_160_drv_RevB_2_2-42_all_en_20130313.zip и dwa-driver.zip:

WinMerge WinMerge

Разница в размерах между dwa-driver.zip и dwa-driver2.zip:

исследователь

Сравнение текста между dwa-driver.zip и dwa-driver2.zip в Beyond Compare 3:

bcompare bcompare

Шестнадцатеричное сравнение в Beyond Compare 3:

bcompare

1 ответ1

4

Команда copy имеет два разных поведения, два разных способа ее использования.

Первый используется для копирования файлов. Такое поведение используется, когда

  • Источником является только один файл, и цель не указана (текущая папка является целью по умолчанию), это путь к папке или только один файл.

  • Источник включает в себя подстановочные знаки, а целью является none (текущая папка) или путь к папке

Второе поведение используется для объединения нескольких исходных файлов в один целевой файл. Такое поведение используется, когда

  • Цель - один файл, а источник - список файлов, разделенных знаком +

  • Цель - один файл, а источник включает в себя шаблоны

Ваша команда copy dwa* d:\dwa-driver.zip использует второе поведение.

И есть большая разница между первым и вторым поведением. По умолчанию при копировании файлы рассматриваются как двоичные данные, но при объединении файлов они считаются ASCII.

В вашем случае, так как команда рассматривается как комбинированная операция, файлы считаются ASCII, а полученный файл содержит данные в исходном файле вплоть до первого 0x1A (посмотрите ваши шестнадцатеричные дампы)

Вы можете решить это, указав команде copy что операция должна быть двоичной

copy /b dwa* d:\dwa-driver.zip

И это будет работать так, как задумано, если только один файл соответствует шаблону. Если ему соответствует более одного файла, они будут объединены в целевой файл.

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