Copia dei file nella cartella dell'applicazione in fase di compilazione


95

Se ho dei file che voglio copiare dal mio progetto nella .\bin\debug\cartella sulla compilation, allora sembra che devo metterli nella root del progetto. Metterli in una sottocartella sembra copiarli nella .\bin\debug\cartella nella stessa struttura in cui sono memorizzati.

C'è un modo per evitarlo?

Giusto per essere chiari: se ho un MyFirstConfigFile.txte MySecondConfigFile.txtin una ConfigFilescartella e ho impostato la loro Copia nell'output su Copia ... , allora appaiono nella .\bin\debug\ConfigFiles\cartella. Voglio che appaiano nella .\bin\debug\cartella.

Risposte:


93

Puoi farlo con un evento di post build. Imposta i file su nessuna azione durante la compilazione, quindi nella macro copia i file nella directory desiderata.

Ecco una macro post build che penso funzionerà copiando tutti i file in una directory chiamata Configurazione nella cartella di build principale:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
Per la destinazione, non dovrebbe essere $ (ProjectDir) \% (OutDir)?
Ed Greaves

11
La macro corretta e testata (Vs2010) è: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot

Puoi anche creare un file relativo per l'output: copia "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
Penso che l'uso delle virgolette sia necessario:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
In MSVS2017 (15.4) dovrebbe essere $(OutDir)(cioè senza $(ProjectDir)) sembra ... altrimenti si ottengono errori di doppio percorso
JHBonarius

51

Puoi usare un'attività MSBuild sul tuo csproj, in questo modo.

Modifica il tuo file csproj

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

Questa è la soluzione migliore in quanto puoi utilizzare i caratteri jolly per copiare molti file e non è necessario che siano nel progetto.
Chris Bordeman il

37

È anche possibile inserire i file o i collegamenti nella radice di Esplora soluzioni e quindi impostare le proprietà dei file:

Build action = Content

e

Copy to Output Directory = Copy if newer (per esempio)

Per un collegamento trascinare il file da Esplora risorse di Windows a Esplora soluzioni tenendo premuti i tasti Maiusc e Control.

inserisci qui la descrizione dell'immagine


3
Ciò manterrà il percorso relativo originale, che non è accettabile per l'OP
jlee

Se metti il ​​file nel nodo di primo livello del tuo progetto, verrà copiato direttamente nella cartella di output $ (OutputPath).
Georg

4

Personalmente preferisco così.

Modificare il .csprojper aggiungere

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
A mio parere molto meglio di un evento evento post-build. Grazie!
khlr

Non equivale a fare clic con il pulsante destro del mouse sul progetto e selezionare "Aggiungi | elemento esistente" da Esplora soluzioni, quindi impostare la proprietà del file "Copia nella directory di output" su "Copia se più recente". Non è necessario modificare direttamente l'XML.
Antony Booth

@AntonyBooth dopo un po 'ti renderai conto che è sempre più facile capire cosa sta succedendo e modificare il codice direttamente piuttosto che imparare a fare la stessa cosa con il tuo IDE. Oggi utilizzi Visual Studio, domani potrebbe essere JetBrains Rider e dopodomani VS Code. Alla fine, è sempre meglio padroneggiare una lingua piuttosto che un IDE. PS: non so se quello che descrivi è lo stesso dato che so come farlo solo in XML, molto meglio così.
Jérôme MEVEL

3

copia da sottocartella a sottocartella

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

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

7
Benvenuto in StackOverflow e grazie per il contributo. Hai risposto a una domanda molto vecchia che ha già un sacco di risposte altamente votate. Se ritieni che la tua risposta sia utile da avere in aggiunta alle risposte già votate, dovresti aggiungere una piccola spiegazione del motivo per cui la tua risposta risolve il problema e perché è migliore / diversa dalle altre.
Matthijs Wessels

1

Vuoi utilizzare un evento Post-Build sul tuo progetto. Puoi specificare l'output lì e ci sono valori macro per cose usate di frequente come il percorso del progetto, il nome dell'elemento, ecc.


0

Puoi usare l'evento PostBuild del progetto. Al termine della compilazione, è possibile eseguire un file batch DOS e copiare i file desiderati nella cartella desiderata.


0

Ho trovato questa domanda cercando "copia i file nella cartella dell'applicazione in fase di compilazione". OP sembra aver già risolto questo problema, ma se non lo fai:

In Visual Studio fai clic con il pulsante destro del mouse sul file, seleziona le proprietà, quindi modifica l'opzione "copia nell'output" in "sempre". Vedi http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP chiede di copiare nella directory di compilazione senza mantenere la struttura di directory relativa del percorso del file copiato
Áxel Costas Pena
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.