コンパイル時にファイルをアプリケーションフォルダにコピーする


93

.\bin\debug\コンパイル時にプロジェクトからフォルダーにコピーするファイルがある場合、それらをプロジェクトのルートに配置する必要があるようです。それらをサブフォルダーに入れると、.\bin\debug\それらが格納されているのと同じ構造でフォルダーにコピーされるようです。

これを回避する方法はありますか?

ちょうどを明確にする:私が持っている場合MyFirstConfigFile.txtMySecondConfigFile.txtConfigFiles、フォルダ、私は彼らのセット出力にコピーするコピー...、それらはで表示され.\bin\debug\ConfigFiles\たフォルダ。それらを.\bin\debug\フォルダに表示します。

回答:


90

ビルド後のイベントでこれを行うことができます。コンパイル時にファイルをアクションなしに設定してから、マクロでファイルを目的のディレクトリにコピーします。

以下は、Configurationと呼ばれるディレクトリ内のすべてのファイルをルートビルドフォルダーにコピーすることで機能すると思われるビルド後のマクロです。

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

1
宛先については、$(ProjectDir)\%(OutDir)にすべきではありませんか?
Ed Greaves

11
正しくテストされた(Vs2010)マクロは次のとおりです: "$(ProjectDir)Firebird \ firebird_bin *" "$(ProjectDir)$(OutDir)"
Eric Bole-Feysot

また、出力用に相対ファイルを実行することもできます: "$(ProjectDir)Firebird \ firebird_bin *" "$(OutDir)"
Elendurwen

3
引用符の使用が必要だと思います:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
MSVS2017(15.4)では、それは$(OutDir)(つまりなしで$(ProjectDir))あるはずです...そうでなければ、ダブルパスエラーが発生します
JHBonarius

51

そのように、csprojでMSBuildタスクを使用できます。

csprojファイルを編集します

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

ワイルドカードを使用して多くのファイルをコピーでき、プロジェクトに存在する必要がないため、これが最良のソリューションです。
Chris Bordeman

37

ファイルまたはリンクをソリューションエクスプローラーのルートに配置し、ファイルのプロパティを設定することもできます。

Build action = Content

そして

Copy to Output Directory = Copy if newer (例えば)

リンクの場合、Windowsエクスプローラーからソリューションエクスプローラーにファイルをドラッグし、ShiftキーとControlキーを押したままにします。

ここに画像の説明を入力してください


3
これにより、元の相対パスが保持されます。これはOPに受け入れられません
jlee

ファイルをプロジェクトの最上位ノードに置くと、出力フォルダー$(OutputPath)に直接コピーされます。
Georg、

3

サブフォルダーからサブフォルダーにコピー

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

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

7
StackOverflowへようこそ。貢献してくれてありがとう。あなたはすでに非常に賛成された回答の束を持っている本当に古い質問に答えました。既存の投票された回答に加えて回答が役立つと思われる場合は、回答が問題を解決する理由と、他の回答の方が優れている/異なる理由について簡単な説明を追加する必要があります。
Matthijs Wessels、2018

3

個人的に私はこの方法を好みます。

.csproj追加するように変更します

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

1
私の意見では、ビルド後のイベントイベントよりも優れています。ありがとうございました!
khlr

これは、プロジェクトを右クリックしてソリューションエクスプローラーから[追加|既存のアイテム]を選択し、ファイルプロパティの[出力ディレクトリにコピー]を[新しい場合はコピー]に設定するのと同じではありません。XMLを直接変更する必要はありません。
アントニーブース

@AntonyBoothを使用すると、IDEで同じことを行う方法を学ぶよりも、何が起こっているのかを理解してコードを直接変更する方が常に簡単であることに気付くでしょう。今日はVisual Studioを使用していますが、明日はJetBrains Riderで、明日はVS Codeです。結局のところ、IDEよりも常に言語を習得する方が優れています。PS:私はあなたが説明するものが同じであるかどうかわかりません。私はXMLでそれを行う方法を知っているだけだからです。
ジェローム・MEVEL

1

プロジェクトでビルド後のイベントを使用したい。そこで出力を指定でき、プロジェクトパス、アイテム名など、頻繁に使用されるもののマクロ値があります。


0

プロジェクトのPostBuildイベントを使用できます。ビルドが完了したら、DOSバッチファイルを実行して、目的のファイルを目的のフォルダーにコピーできます。


0

この質問は、「コンパイル時にファイルをアプリケーションフォルダーにコピーする」で検索されました。OPは既にこれをソートしているようですが、そうでない場合:

Visual Studioでファイルを右クリックし、プロパティを選択して、[出力にコピー]オプションを[常に]に変更します。http://msdn.microsoft.com/en-us/library/0c6xyb66.aspxを参照してください


5
OPは、コピーされたファイル位置の相対的なディレクトリ構造を維持せずにディレクトリをコンパイルするためにコピーを要求
アクセルコスタスペナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.