Что происходит неправильно, когда Visual Studio сообщает мне, что "xcopy завершен с кодом 4"

Я не очень хорошо знаком с событиями после сборки, поэтому я немного запутался в том, что происходит с моей программой. При компиляции в visual studio 2010 я получаю следующее:

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.    

Программа работает нормально, несмотря на эту ошибку, но я не хочу просто игнорировать эту проблему и надеюсь, что ничего плохого не произойдет. Как ни странно, эта строка начиналась как только одна команда (первая xcopy), но поскольку я продолжал компилировать проект (исправление других проблем, в основном ссылок), сообщение об ошибке расширялось все больше и больше. Любая идея, что может происходить?

Изменить: вот события postbuild, которые, кажется, терпят неудачу -

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

Ответ 1

Код выхода Xcopy 4 означает "Произошла ошибка инициализации. Недостаточно памяти или дискового пространства, или вы ввели неверное имя диска или неверный синтаксис в командной строке".

Похоже, что Visual Studio предоставляет недопустимые аргументы в xcopy. Проверьте вашу команду события после сборки через Project > Right Click > Properties > Build Events > Post Build Event.

Обратите внимание, что если $(ProjectDir) или подобные макрокоманды имеют пробелы в результирующих путях при раскрытии, то их необходимо будет заключить в двойные кавычки. Например:

xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1

Ответ 2

Переключите вкладку watch в "ouput" и найдите команду xcopy. Иногда здесь вы найдете еще несколько сообщений (фактический вывод xcopy), которые могут помочь вам решить проблему. Если вы не видите вкладку вывода, используйте меню "Просмотр-вывод", чтобы показать ее.

Ответ 3

В дополнение к принятому ответу ошибка может также возникать, когда целевая папка доступна только для чтения (Common при использовании TFS)

Ответ 4

Если исходный файл не найден, xcopy также возвращает код ошибки 4.

Ответ 5

Я получил ошибку "exited with code 4", когда команда xcopy пыталась перезаписать файл только для чтения. Мне удалось решить эту проблему, добавив /R к команде xcopy. /R указывает, что файлы только для чтения должны быть перезаписаны

старая команда:

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

новая команда

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

Ответ 6

Как объясняют другие ответы, код выхода 4 может иметь много причин.

Я заметил случай, где результирующие имена путей превысили максимально допустимую длину (так же, как здесь).

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

Ответ 7

Это означает:

Произошла ошибка инициализации. Недостаточно памяти или места на диске, или вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке.

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

Ответ 8

Я получил это вместе с сообщением

Недопустимая спецификация диска

при копировании на сетевой ресурс без указания имени диска, например

xcopy . \\localhost

где

xcopy . \\localhost\share

ожидалось

Ответ 9

Я столкнулся с этой проблемой, поэтому я запустил команду xcopy из командной строки и сказал:

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

На самом деле Visual Studio держала что-то. Я только что перезапустил Visual Studio, и он сработал.

Ответ 10

В моем случае проблема возникла из-за неправильного порядка сборки. Один проект имел команду xcopy для событий после сборки, чтобы скопировать файлы из папки bin в другую папку. Но из-за неправильных зависимостей новые файлы создавались в папке bin, пока выполняется xcopy.

В VS щелкните правой кнопкой мыши проект, в котором есть события после сборки. Перейдите в раздел "Зависимости построения" > "Зависимости проектов" и убедитесь, что он правильный. Проверьте порядок создания проекта (следующая вкладка на зависимости).

Ответ 11

У меня такая же проблема. Вы также можете проверить, куда указывает косая черта. Для меня это работало, чтобы использовать обратную косую черту вместо прямой косой черты. пример

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

Вместо:

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

Ответ 12

У меня была команда посткомпоновки, которая работала очень хорошо до того, как я выполнил обновление для VS 2017. Оказалось, что инструменты SDK обновились и находились под новым путем, поэтому он не смог найти инструмент, который использовал для подписи своих сборок.

Это изменилось с этого....

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"

К этому...

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

Очень тонкое, но серьезное изменение, поэтому проверяйте свои пути после обновления, если видите эту ошибку.

Ответ 13

Еще одна вещь, чтобы следить за это двойные обратные косые, так как xcopy не переносит их в параметре ввода пути (но он переносит их в выходной тракт...).

enter image description here

Ответ 14

Если какое-либо другое решение находится в режиме отладки, сначала остановите их все, а затем перезапустите Visual Studio. Это сработало для меня.