O comando Copiar no CMD copia 734 Byte em vez de 22 MB?

2

Eu tenho o arquivo DWA_160_drv_RevB_2_2-42_all_en_20130313.zip na área de trabalho. Eu quero copiá-lo para uma unidade flash USB usando o CMD. Eu uso o comando copy para fazer isso, mas estou obtendo resultados bizarros, ou seja, o arquivo original é cerca de 30 mil (!!) vezes maior que o novo arquivo.

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:\>

Como isso pode ser? ... como isso é possível? O comando é concluído com sucesso, mas o arquivo resultante é como uma gota de água no oceano quando você compara o tamanho dele e aparentemente está corrompido.

Estou fazendo algo errado aqui?

Eu pensei que poderia ter a ver com a maneira que eu digito no caminho de pesquisa de origem e destino, então adicionei aspas. Eu não posso dizer que ajudou.

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:\>

Então, decidi usar o nome completo do arquivo de origem, utilizando o recurso de preenchimento automático no CMD para garantir que ele seja digitado corretamente. E desta vez deu certo! Aqui está o comando.

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:\>

Então desta vez funcionou!?!? Qual é a diferença entre dwa-driver2.zip e dwa-driver.zip? E como o arquivo original - DWA_160_drv_RevB_2_2-42_all_en_20130313.zip - compara com dwa-driver.zip? Para responder, fiz uma comparação lado a lado textual e hexadecimal. Veja as capturas de tela abaixo.

O que exatamente acontece na linha 6? Por que está copiando as 5 primeiras linhas sem um problema e depois fica preso na linha 6 (veja a captura de tela do WinMerge)? Ambos os arquivos são idênticos, até a linha 6, e desse ponto em diante nenhum outro dado é copiado para o novo arquivo. Por quê? Não tenho permissão para usar caracteres curinga com o comando copy?

Atualizar

Vou apenas chamar de bug e usar o comando xcopy porque ele aceita qualquer coisa que eu lance nele. Não importa se há caracteres curinga ou não. É lamentável que o comando xcopy não esteja disponível em todos os modos do Windows e janelas de prompt de comando.

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:\>

Screenshots

Clique para ver maior.

Comparação de texto entre DWA_160_drv_RevB_2_2-42_all_en_20130313.zip e dwa-driver.zip:

Diferença de tamanho entre o dwa-driver.zip e o dwa-driver2.zip:

Comparação de texto entre dwa-driver.zip e dwa-driver2.zip em Beyond Compare 3:

Comparação hexadecimal em Beyond Compare 3:

    
por Samir 10.10.2013 / 13:52

1 resposta

4

O comando

copy tem dois comportamentos diferentes, duas maneiras diferentes de usá-lo.

O primeiro é usado para copiar arquivos. Esse é o comportamento usado quando

  • A origem é apenas um arquivo e o destino não é indicado (a pasta atual é o destino por padrão), é um caminho de pasta ou é apenas um arquivo.

  • A origem inclui caracteres curinga e o destino é nenhum (pasta atual) ou um caminho de pasta

O segundo comportamento é usado para combinar vários arquivos de origem em um arquivo de destino. Esse comportamento é usado quando

  • O destino é um arquivo e a origem é uma lista de arquivos separados por um sinal +

  • O destino é um arquivo e a origem inclui curingas

Seu comando, copy dwa* d:\dwa-driver.zip usa o segundo comportamento.

E há uma grande diferença entre o primeiro e o segundo comportamento. Por padrão, quando copiar os arquivos são considerados dados binários, mas quando os arquivos são combinados, eles são considerados como ASCII.

No seu caso, como o comando é considerado como uma operação de combinação, os arquivos são considerados ASCII e o arquivo resultante contém dados no arquivo de origem até o primeiro caractere 0x1A (procure em seus dumps hexadecimais)

Você pode resolvê-lo indicando ao comando copy que a operação deve ser binária

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

E isso funcionará como esperado se apenas um arquivo corresponder ao curinga. Se mais de um arquivo corresponder a ele, eles serão combinados no arquivo de destino.

    
por 08.11.2014 / 16:58