Menyalin file ke dalam folder aplikasi pada waktu kompilasi


96

Jika saya memiliki beberapa file yang ingin saya salin dari proyek saya ke dalam .\bin\debug\folder saat kompilasi, maka sepertinya saya harus meletakkannya di root proyek. Menempatkannya ke dalam subfolder tampaknya akan menyalinnya ke .\bin\debug\folder dalam struktur yang sama dengan tempat penyimpanannya.

Apakah ada cara untuk menghindari hal ini?

Hanya untuk memperjelas: jika saya memiliki MyFirstConfigFile.txtdan MySecondConfigFile.txtdi dalam ConfigFilesfolder dan saya mengatur Salin ke Output menjadi Salin ... , maka mereka akan muncul di .\bin\debug\ConfigFiles\folder. Saya ingin mereka muncul di .\bin\debug\folder.

Jawaban:


94

Anda dapat melakukan ini dengan acara pasca membangun. Setel file ke tanpa tindakan pada kompilasi, lalu di makro salin file ke direktori yang Anda inginkan.

Berikut adalah post build Macro yang menurut saya akan berfungsi dengan menyalin semua file dalam direktori bernama Konfigurasi ke folder root build:

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

1
Untuk tujuan, bukankah seharusnya $ (ProjectDir) \% (OutDir)?
Ed Greaves

11
Makro yang benar dan diuji (Vs2010) adalah: salin "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot

Anda juga dapat melakukan file relatif untuk keluaran: salin "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
Saya pikir penggunaan tanda kutip perlu:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
Di MSVS2017 (15.4) seharusnya $(OutDir)(yaitu tanpa $(ProjectDir)) tampaknya ... jika tidak, Anda akan mendapatkan kesalahan jalur ganda
JHBonarius

51

Anda dapat menggunakan tugas MSBuild di csproj Anda, seperti itu.

Edit file csproj Anda

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

Ini adalah solusi terbaik karena Anda dapat menggunakan wildcard untuk menyalin banyak file, dan mereka tidak perlu berada dalam proyek.
Chris Bordeman

38

Anda juga dapat meletakkan file atau tautan ke root explorer solusi dan kemudian mengatur properti file:

Build action = Content

dan

Copy to Output Directory = Copy if newer (sebagai contoh)

Untuk tautan seret file dari windows explorer ke explorer solusi dengan menahan tombol shift dan kontrol.

masukkan deskripsi gambar di sini


3
Ini akan mempertahankan jalur relatif asli, yang tidak dapat diterima oleh OP
jlee

Jika Anda meletakkan file tersebut ke node tingkat atas proyek Anda, maka file tersebut akan disalin langsung ke folder output $ (OutputPath).
Georg

1
Lihat posting ini untuk alternatif yang dapat diterima
Zoey Hewll

5

Secara pribadi saya lebih suka cara ini.

Ubah .csprojuntuk menambahkan

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

1
Menurut saya jauh lebih baik daripada event event post-build. Terima kasih!
khlr

Bukankah ini sama dengan mengklik kanan proyek dan memilih "Add | Existing Item" dari Solution Explorer, kemudian mengatur properti File "Salin ke Direktori Output" menjadi "Salin jika lebih baru". Tidak perlu mengubah XML secara langsung.
Antony Booth

1
@AntonyBooth setelah beberapa saat Anda akan menyadari bahwa selalu lebih mudah untuk memahami apa yang terjadi dan memodifikasi kode secara langsung daripada mempelajari cara melakukan hal yang sama dengan IDE Anda. Hari ini Anda menggunakan Visual Studio, besok mungkin JetBrains Rider dan lusa VS Code. Pada akhirnya, Anda selalu lebih menguasai suatu bahasa daripada IDE. PS: Saya tidak tahu apa yang Saudara gambarkan itu sama karena saya hanya tahu bagaimana melakukannya dalam XML, jauh lebih baik seperti ini.
Jérôme MEVEL

Selain itu, saat ini tidak ada cara untuk menyetel jalur target dalam IDE, jadi untuk saat ini kami harus mengedit XML.
Zoey Hewll

3

salin dari subfolder ke subfolder

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

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

7
Selamat datang di StackOverflow dan terima kasih telah berkontribusi. Anda telah menjawab pertanyaan yang sangat lama yang sudah memiliki banyak jawaban yang sangat disukai. Jika menurut Anda jawaban Anda bermanfaat untuk dimiliki selain jawaban positif yang ada, Anda harus menambahkan sedikit penjelasan mengapa jawaban Anda menyelesaikan masalah dan mengapa lebih baik / berbeda dari yang lain.
Matthijs Wessels

1

Anda ingin menggunakan acara Pasca-Bangun pada proyek Anda. Anda dapat menentukan output di sana dan ada nilai makro untuk hal-hal yang sering digunakan seperti jalur proyek, nama item, dll.


0

Anda dapat menggunakan acara PostBuild dari proyek tersebut. Setelah build selesai, Anda dapat menjalankan file batch DOS dan menyalin file yang diinginkan ke folder yang Anda inginkan.


0

Saya menemukan pertanyaan ini mencari "salin file ke folder aplikasi pada waktu kompilasi". OP tampaknya sudah mengurutkan ini, tetapi jika Anda tidak:

Di Visual Studio klik kanan file tersebut, pilih properties, kemudian ubah opsi 'copy to output' menjadi 'always'. Lihat http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP meminta penyalinan ke direktori kompilasi tanpa menjaga struktur direktori relatif dari lokasi file yang disalin
Áxel Costas Pena
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.