O que está errado quando o Visual Studio me diz "xcopy saiu com o código 4"

125

Não estou familiarizado com os eventos pós-compilação, por isso estou um pouco confuso com o que está acontecendo de errado com o meu programa. Ao compilar no visual studio 2010, recebo o seguinte:

The command "xcopy C:\Users\Me\Path\Foo.bar\Library\dsoframer.ocx C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\Foo.bar\ApplicationFiles C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
xcopy C:\Users\Me\Path\url\ C:\Users\Me\Path\Foo.bar\bin\Debug\ /Y /E /D
rmdir /S /Q C:\Users\Me\Path\Foo.bar\bin\Debug\.gwt-tmp" exited with code 4.    

O programa parece funcionar bem, apesar desse erro, mas não quero ignorar esse problema e espero que nada de ruim aconteça. Estranhamente, essa linha começou como apenas um comando (o primeiro xcopy), mas enquanto eu continuava a compilar o projeto (corrigindo outros problemas, principalmente referências), a mensagem de erro se expandia cada vez mais. Alguma idéia do que poderia estar acontecendo?

Edit: Aqui estão os eventos pós-construção que parecem estar falhando -

xcopy $(ProjectDir)Library\dsoframer.ocx $(TargetDir) /Y /E /D
xcopy $(ProjectDir)ApplicationFiles $(TargetDir) /Y /E /D
xcopy $(SolutionDir)com.myUrl.gwt\www $(TargetDir) /Y /E /D
rmdir /S /Q $(TargetDir).gwt-tmp
Sonhador Corvo
fonte
2
Além das respostas abaixo, também abra o VS com Administrator privileges. Copiar para locais específicos requer direitos de administrador.
Nikhil Agrawal

Respostas:

166

O código de saída Xcopy 4 significa " Ocorreu um erro de inicialização. Não há memória ou espaço em disco suficiente, ou você digitou um nome de unidade inválido ou sintaxe inválida na linha de comando " .

Parece que o Visual Studio está fornecendo argumentos inválidos para o xcopy. Verifique seu comando de evento pós-compilação via Project > Right Click > Properties > Build Events > Post Build Event.

Observe que, se os $(ProjectDir)termos da macro ou similares tiverem espaços nos caminhos resultantes quando expandidos, eles precisarão ser colocados entre aspas duplas. Por exemplo:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Mark Cidade
fonte
Como eu disse, não sei muito sobre scripts de eventos pós-compilação (e não os escrevi); onde eu encontro isso?
Raven Dreamer #
1
Vá para o projeto Propriedades> Eventos de Construção
Mark Cidade
2
Tente agrupar cada comando com aspas duplas ( "command args").
Grant Thomas
@ Mark Cidade - Parece que não tenho "Build Events" em lugar algum. Propriedades comuns listadas: "Projeto de inicialização; Dependências do projeto; Arquivos de origem de depuração; Configurações de análise de código". Propriedades de configuração listadas: "configuração".
Raven Dreamer #
4
@RavenDreamer: se o $(ProjectDir)(e / ou similar) tiver espaços no caminho expandido, ele precisará ser colocado entre aspas. Por exemplo:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Grant Thomas
34

Mude a guia watch para "ouput" e procure o comando xcopy. Às vezes, aqui você encontra mais alguma mensagem (a saída real do xcopy) que pode ajudá-lo a resolver o problema. Se você não vir a guia de saída, use o menu Exibir-Saída para mostrá-la.

Felice Pollano
fonte
30

Além da resposta aceita, o erro também pode ocorrer quando a pasta de destino é somente leitura (comum ao usar o TFS)

Pieter
fonte
2
E algo que você pode ver se mudar para a janela de saída como @FelicePollano mencionado abaixo.
Jedidja
20

Se o arquivo de origem não for encontrado, o xcopy retornará o código de erro 4 também.

Der_Meister
fonte
3
esse foi o meu caso. eu usei o $(TargetDir)que termina com Release\ . Usando $(ProjectDir)\bin\Releasesem a fuga \\ funcionou para mim
Multinerd
12

Recebi o erro ' encerrado com o código 4 ' quando o comando xcopy tentou substituir um arquivo somente leitura. Eu consegui resolver esse problema adicionando / R ao comando xcopy. O / R indica que os arquivos somente leitura devem ser substituídos

comando antigo:

XCOPY /E /Y "$(ProjectDir)source file" "destination"

novo comando

XCOPY /E /Y /R "$(ProjectDir)source file" "destination"
martijn
fonte
8

Como outras respostas explicam, o código de saída 4 pode ter muitas causas.

Percebi um caso em que os nomes dos caminhos resultantes excederam o comprimento máximo permitido (exatamente como aqui ).

Substituí o xcopy por robocopy para o evento pós-compilação afetado; O robocopy parece manipular caminhos ligeiramente diferentes e conseguiu concluir a tarefa de cópia que o xcopy não conseguiu.

CodeFox
fonte
5

Significa :

Ocorreu um erro de inicialização. Não há memória ou espaço em disco suficiente, ou você digitou um nome de unidade inválido ou sintaxe inválida na linha de comando.

Então, basicamente, pode ser qualquer coisa haha ​​... tente executar o comando um de cada vez no prompt de comando para descobrir qual parte de qual comando está causando problemas.

BrandonZeider
fonte
3

Eu recebi isso junto com a mensagem

Especificação de unidade inválida

ao copiar para um compartilhamento de rede sem especificar o nome da unidade, por exemplo

xcopy . \\localhost

Onde

xcopy . \\localhost\share

era esperado

Thomas Weller
fonte
2

Corri com esse problema, executei o comando xcopy na linha de comando e ele disse:

File creation error - The requested operation cannot be performed on a file with
 a user-mapped section open.

Na verdade, era o Visual Studio segurando algo. Acabei de reiniciar o Visual Studio e funcionou.

NielW
fonte
1

No meu caso, o problema ocorreu devido à ordem de compilação incorreta. Um projeto tinha um comando xcopy em eventos pós-compilação para copiar arquivos da pasta bin para outra pasta. Porém, devido a dependências incorretas, novos arquivos foram criados na pasta bin enquanto o xcopy está em andamento.

No VS, clique com o botão direito do mouse no projeto em que você tem eventos pós-compilação. Vá para Construir dependências> Dependências do projeto e verifique se está correto. Verifique também a ordem de criação do projeto (próxima guia para dependências).

sree
fonte
1

Este erro ocorre devido a espaços em branco nos quais seu repositório é copiado. Por exemplo, meu projeto é copiado no local abaixo c://projects/My rest project e você pode ver os espaços em branco lá. Se você alterar o caminho do repositório para abaixo, ele deve funcionar c://projects/myrestproject

Tushar Mali
fonte
0

Eu tive o mesmo problema. Você também pode verificar para onde a barra está apontando. Para mim, trabalhou para usar barra invertida, em vez de barra invertida. Exemplo

xcopy /s /y "C:\SFML\bin\*.dll" "$(OutDir)"

Ao invés de:

xcopy /s /y "C:/SFML/bin/*.dll" "$(OutDir)"
Marc Dirven
fonte
0

Eu tinha um comando pós-compilação que funcionou bem antes de fazer uma atualização no VS 2017. As ferramentas do SDK foram atualizadas e estavam em um novo caminho, por isso não foi possível encontrar a ferramenta que eu estava usando para assinar meus assemblies.

Isso mudou a partir disso ....

call "%VS140COMNTOOLS%vsvars32"
    "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

Para isso...

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe" -Ra "$(TargetPath)" "$(ProjectDir)Key.snk"

Mudança muito sutil, mas que quebra, por isso verifique seus caminhos após uma atualização, se você vir esse erro.

Fütemire
fonte
0

Outra coisa a observar é barras invertidas duplas, uma vez que xcopynão tolerá-los no parâmetro caminho de entrada (mas não tolerá-los no caminho de saída ...).

insira a descrição da imagem aqui

Elaskanator
fonte
0

Se alguma outra solução estiver no modo de depuração, pare-as primeiro e depois reinicie o visual studio. Funcionou para mim.

Savan Gadhiya
fonte
0

Isso também pode ocorrer se a pasta de destino for usada por outros processos . Feche todos os programas que podem usar a pasta de destino e tente.

Você pode usar o monitor de recursos (ferramenta do Windows) para verificar os processos que usam sua pasta de destino.

Isso funcionou para mim!

Pravin kumar
fonte