Copie de fichiers dans le dossier de l'application au moment de la compilation

95

Si j'ai des fichiers que je souhaite copier de mon projet dans le .\bin\debug\dossier lors de la compilation, il semble que je doive les mettre à la racine du projet. Les placer dans un sous-dossier semble les copier dans le .\bin\debug\dossier dans la même structure dans laquelle ils sont stockés.

y-a-t-il un moyen d'éviter ça?

Juste pour être clair: si j'ai un MyFirstConfigFile.txtet MySecondConfigFile.txtdans un ConfigFilesdossier et que je définisse leur Copie en sortie sur Copie ... , ils apparaissent dans le .\bin\debug\ConfigFiles\dossier. Je veux qu'ils apparaissent dans le .\bin\debug\dossier.

Andrew Ducker
la source

Réponses:

93

Vous pouvez le faire avec un événement post build. Définissez les fichiers sur aucune action lors de la compilation, puis dans la macro, copiez les fichiers dans le répertoire souhaité.

Voici une macro de post build qui, je pense, fonctionnera en copiant tous les fichiers d'un répertoire appelé Configuration dans le dossier de build racine:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)
JoshBerke
la source
1
Pour la destination, ne devrait-il pas être $ (ProjectDir) \% (OutDir)?
Ed Greaves
11
La macro corrigée et testée (Vs2010) est: copier "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot
Vous pouvez également simplement créer un fichier relatif pour la sortie: copier "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen
3
Je pense que l'utilisation de guillemets est nécessaire:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus
1
Dans MSVS2017 (15.4), il devrait juste être $(OutDir)(c'est-à-dire sans $(ProjectDir)) il semble ... sinon vous obtenez des erreurs de double chemin
JHBonarius
51

Vous pouvez utiliser une tâche MSBuild sur votre csproj, comme ça.

Modifiez votre fichier csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>
Jhonny D. Cano -Leftware-
la source
C'est la meilleure solution car vous pouvez utiliser des caractères génériques pour copier de nombreux fichiers, et ils n'ont pas besoin d'être dans le projet.
Chris Bordeman
37

Vous pouvez également placer les fichiers ou les liens à la racine de l'explorateur de solutions, puis définir les propriétés des fichiers:

Build action = Content

et

Copy to Output Directory = Copy if newer (par exemple)

Pour un lien, faites glisser le fichier de l'explorateur Windows vers l'explorateur de solutions en maintenant les touches Maj et Contrôle enfoncées.

entrez la description de l'image ici

Georg
la source
3
Cela conservera le chemin relatif d'origine, ce qui n'est pas acceptable pour l'OP
jlee
Si vous placez le fichier dans le nœud de niveau supérieur de votre projet, il sera copié directement dans le dossier de sortie $ (OutputPath).
Georg
4

Personnellement, je préfère cette façon.

Modifier le .csprojpour ajouter

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
Jérôme MEVEL
la source
1
À mon avis, bien mieux qu'un événement après la construction. Je vous remercie!
khlr le
N'est-ce pas la même chose que de cliquer avec le bouton droit sur le projet et de sélectionner «Ajouter | Élément existant» dans l'Explorateur de solutions, puis de définir la propriété Fichier «Copier dans le répertoire de sortie» sur «Copier si plus récent». Il n'est pas nécessaire de modifier directement le XML.
Antony Booth
@AntonyBooth après un certain temps, vous vous rendrez compte qu'il est toujours plus facile de comprendre ce qui se passe et de modifier le code directement plutôt que d'apprendre à faire la même chose avec votre IDE. Aujourd'hui, vous utilisez Visual Studio, demain ce pourrait être JetBrains Rider et après-demain VS Code. À la fin, vous maîtrisez toujours mieux une langue plutôt qu'un IDE. PS: Je ne sais pas si ce que vous décrivez est le même puisque je ne sais comment le faire qu'en XML, bien mieux comme ça.
Jérôme MEVEL
3

copier du sous-dossier au sous-dossier

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"
Ehsäɳ Khʌɳ
la source
7
Bienvenue sur StackOverflow et merci de votre contribution. Vous avez répondu à une question très ancienne qui contient déjà un tas de réponses très positives. Si vous pensez qu'il est utile d'avoir votre réponse en plus des réponses existantes, vous devriez ajouter une petite explication pour expliquer pourquoi votre réponse résout le problème et pourquoi elle est meilleure / différente des autres.
Matthijs Wessels
1

Vous souhaitez utiliser un événement Post-Build sur votre projet. Vous pouvez y spécifier la sortie et il existe des valeurs de macro pour les choses fréquemment utilisées comme le chemin du projet, le nom de l'élément, etc.

Mark Sherretta
la source
0

Vous pouvez utiliser l'événement PostBuild du projet. Une fois la construction terminée, vous pouvez exécuter un fichier de commandes DOS et copier les fichiers souhaités dans le dossier souhaité.

Kirtan
la source
0

J'ai trouvé cette question à la recherche de "copier des fichiers dans le dossier de l'application au moment de la compilation". OP semble avoir déjà trié ce problème, mais si vous ne le faites pas:

Dans Visual Studio, cliquez avec le bouton droit sur le fichier, sélectionnez les propriétés, puis modifiez l'option «copier dans la sortie» en «toujours». Voir http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx

Colonel Panic
la source
5
OP demande une copie dans le répertoire de compilation sans conserver la structure de répertoire relative de l'emplacement du fichier copié
Áxel Costas Pena