Qu'est-ce qui ne va pas lorsque Visual Studio me dit "xcopy est sorti avec le code 4"


126

Je ne suis pas très familier avec les événements post-build, donc je suis un peu confus quant à ce qui ne va pas avec mon programme. Lors de la compilation dans Visual Studio 2010, j'obtiens ce qui suit:

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.    

Le programme semble fonctionner correctement, malgré cette erreur, mais je ne veux pas simplement ignorer ce problème et espérer que rien de mauvais ne se produira. Étrangement, cette ligne a commencé comme une seule commande (la première xcopy) mais au fur et à mesure que je continuais à compiler le projet (en résolvant d'autres problèmes, principalement des références), le message d'erreur était de plus en plus large. Une idée de ce qui pourrait se passer?

Edit: Voici les événements postbuild qui semblent échouer -

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

2
Outre les réponses ci-dessous, assurez-vous également d'ouvrir VS avec Administrator privileges. La copie vers des emplacements spécifiques nécessite des droits d'administrateur.
Nikhil Agrawal

Réponses:


167

Le code de sortie Xcopy 4 signifie "Une erreur d'initialisation s'est produite. Il n'y a pas assez de mémoire ou d'espace disque, ou vous avez entré un nom de lecteur non valide ou une syntaxe non valide sur la ligne de commande. "

Il semble que Visual Studio fournit des arguments non valides à xcopy. Vérifiez votre commande d'événement post-construction via Project > Right Click > Properties > Build Events > Post Build Event.

Notez que si les $(ProjectDir)termes de macro ou similaires ont des espaces dans les chemins résultants lorsqu'ils sont développés, ils devront être placés entre guillemets. Par exemple:

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

Comme je l'ai dit, je ne connais pas grand chose aux scripts d'événements post-build (et je ne les ai pas écrits); où est-ce que je trouve ça?
Raven Dreamer

1
Accédez aux propriétés du projet> Événements de construction
Mark Cidade

2
Essayez d'encapsuler chaque commande avec des guillemets doubles ( "command args").
Grant Thomas

@Mark Cidade - Je ne semble pas avoir de "Build Events" nulle part. Propriétés communes répertoriées: «Projet de démarrage; Dépendances de projet; Fichiers sources de débogage; Paramètres d'analyse de code». Propriétés de configuration répertoriées: "configuration".
Raven Dreamer

4
@RavenDreamer: Si le $(ProjectDir)(et / ou similaire) a des espaces dans le chemin développé, il devra être entouré de guillemets. Par exemple:xcopy "$(ProjectDir)Library\dsoframer.ocx" "$(TargetDir)" /Y /E /D1
Grant Thomas

34

Basculez l'onglet de surveillance sur la "sortie" et recherchez la commande xcopy. Parfois, vous trouverez ici un message supplémentaire (la sortie xcopy réelle) qui pourrait vous aider à résoudre le problème. Si vous ne voyez pas l'onglet de sortie, utilisez le menu Affichage-Sortie pour l'afficher.


30

En plus de la réponse acceptée, l'erreur peut également se produire lorsque le dossier de destination est en lecture seule (courant lors de l'utilisation de TFS)


2
Et quelque chose que vous pouvez voir si vous passez à la fenêtre de sortie comme @FelicePollano mentionné ci-dessous.
Jedidja

20

Si le fichier source n'est pas trouvé, xcopy renvoie également le code d'erreur 4 .


3
c'était mon cas. j'ai utilisé $(TargetDir)ce qui se termine par Release\ . Utiliser $(ProjectDir)\bin\Releasesans le suivi a \\ fonctionné pour moi
Multinerd

12

J'ai reçu l' erreur « sorti avec le code 4 » lorsque la commande xcopy a tenté d'écraser un fichier en lecture seule. J'ai réussi à résoudre ce problème en ajoutant / R à la commande xcopy. Le / R indique que les fichiers en lecture seule doivent être écrasés

ancienne commande:

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

nouvelle commande

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

8

Comme d'autres réponses l'expliquent, le code de sortie 4 peut avoir de nombreuses causes.

J'ai remarqué un cas où les noms de chemin résultants dépassaient la longueur maximale autorisée (comme ici ).

J'ai remplacé xcopy par robocopy pour l'événement post build affecté; robocopy semble gérer les chemins légèrement différents et a pu terminer la tâche de copie que xcopy n'a pas pu gérer.


5

Cela signifie :

Une erreur d'initialisation s'est produite. Il n'y a pas assez de mémoire ou d'espace disque, ou vous avez entré un nom de lecteur ou une syntaxe non valide sur la ligne de commande.

Donc, fondamentalement, cela pourrait être à peu près n'importe quoi haha ​​... essayez d'exécuter la commande une par une à partir de l'invite de commande pour déterminer quelle partie de quelle commande vous pose problème.


3

J'ai compris ça avec le message

Spécification de lecteur non valide

lors de la copie sur un partage réseau sans spécifier le nom du lecteur, par exemple

xcopy . \\localhost

xcopy . \\localhost\share

était attendu


2

J'ai rencontré ce problème, alors j'ai exécuté la commande xcopy à partir de la ligne de commande et elle a dit:

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

C'était en fait Visual Studio qui tenait quelque chose. Je viens de redémarrer Visual Studio et cela a fonctionné.


1

Dans mon cas, le problème était dû à un ordre de construction incorrect. Un projet avait une commande xcopy sur les événements post-build pour copier les fichiers du dossier bin vers un autre dossier. Mais en raison de dépendances incorrectes, de nouveaux fichiers étaient créés dans le dossier bin pendant que xcopy était en cours.

Dans VS, faites un clic droit sur le projet dans lequel vous avez des événements post-build. Accédez à Build Dependencies> Project Dependencies et assurez-vous que c'est correct. Vérifiez également l'ordre de construction du projet (onglet suivant des dépendances).


1

Cette erreur est due au fait qu'il existe des espaces blancs où votre dépôt est copié. Par exemple, mon projet est copié à l'emplacement ci-dessous, c://projects/My rest project vous pouvez voir les espaces blancs là-bas, si vous modifiez votre chemin de dépôt en dessous, cela devrait fonctionner c://projects/myrestproject


0

J'ai eu le même problème. Vous pouvez également vérifier dans quelle direction la barre oblique pointe. Pour moi, cela fonctionnait d'utiliser une barre oblique inverse, au lieu d'une barre oblique. Exemple

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

Au lieu de:

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

0

J'avais une commande post build qui fonctionnait très bien avant de faire une mise à jour sur VS 2017. Il s'est avéré que les outils du SDK étaient mis à jour et étaient sous un nouveau chemin, donc il ne pouvait pas trouver l'outil que j'utilisais pour signer mes assemblages.

Cela a changé depuis ...

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"

Pour ça...

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

Changement très subtil mais cassant, alors vérifiez vos chemins après une mise à jour si vous voyez cette erreur.


0

Une autre chose à surveiller est backslashes double, puisque xcopyne les tolère pas dans le paramètre de chemin d'entrée (mais il ne les supporte dans la voie de sortie ...).

entrez la description de l'image ici


0

Si une autre solution est en mode débogage, arrêtez-les d'abord toutes et ensuite redémarrez le studio visuel. Cela a fonctionné pour moi.


0

Cela peut également arriver si le dossier cible est utilisé par d'autres processus . Fermez tous les programmes susceptibles d'utiliser le dossier cible et essayez.

Vous pouvez utiliser le moniteur de ressources (outil Windows) pour vérifier les processus qui utilisent votre dossier cible.

Cela a fonctionné pour moi !.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.