【C#】Windows Formsアプリで、特定のファイルを実行フォルダにコピーする方法

2024年2月20日

ワーキングディレクトリ(作成されたexeファイル:実行ファイルの保存されているフォルダ)に必要なファイルをコピーする様子をみていきましょう

実行ファイルはどこに作成・保存される?

VisualStudioで作成されたアプリケーションは実行ファイルとして作成・保存されます
このファイルはVisualStudioを起動することなく、Windowsアプリケーションとして単独で動作させることができます

フレームワークによる作成・保存される場所の違い

ソリューションをビルドすると、実行ファイルは次の場所に作成されます
キャプチャでは、デバッグビルド時のフォルダを指しています

.Net Frameworkの場合

.NETの場合

.NET8バージョンの場合はnet8.0-windowsフォルダになります
数字の部分はバージョン番号です

実行ファイルと同じフォルダ(ワーキングディレクトリ)にファイルを保存するには

実行ファイルが保存されているフォルダと同じフォルダに、ビルドするとコピーされるようにしましょう

コピーされるファイル(元のファイル)の準備

今回は、文字列が保存されるテキストファイルにします
プロジェクトにテキストファイルを追加します

プロジェクトにファイルを追加します

追加するファイル種別を選択して、適切なファイル名を付けます

ソリューションエクスプローラにファイルが追加されます

プロパティを確認すると、出力ディレクトリにコピーの項目が「コピーしない」になっています

プロパティで出力ディレクトリにコピー項目の変更

常にコピーを選択することで出力ディレクトリ(ワーキングディレクトリ)にビルドするとコピーされるようになります

ビルド

ビルド(B)メニューからソリューションのビルド、または、開始ボタンを押してビルド後実行するとアプリケーションが作成されます

実行してコピー結果の確認

コピーされているか確認してみましょう

全てのファイル表示アイコンをクリックして、コピーされていることを確認します

エクスプローラで確認することもできます

もし、表示されない場合、全て表示アイコンの2つ左のリロードアイコンをクリックして再表示させましょう

このフォルダにファイルを保存したい場合、どのようにすればいいでしょうか?
ビルド後に手でコピーしていませんか?

ここでは、設定によって、ビルド時に自動的にコピーされる手順についてみていきましょう

確認サンプル

ここでは、外部ファイルからテキストデータを読み込んで、ラベルに表示するプログラムを例にしています

フォームデザイン

ラベルを1つ追加しています

テキストファイルの内容追加

そリューしょエクスプローラーから追加したTextFile1.txtを選択して入力できます

AAA

コード

TextFile1.txtファイルを読み込んでlabel1に表示されます
このコードでは、ReadAllTextメソッドの引数に直接ファイル名が記述されています
これにより、TextFile1.txtファイルが実行ファイルと同じフォルダ(ワーキングディレクトリ)にある必要があります

実行ファイルにコピーされるようにしていますので、これでOKですよね
更新作業をするのは、プロジェクトフォルダ内(コピー元)のTextFile1.txtファイルになりますので注意してください

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        label1.Text = File.ReadAllText("TextFile1.txt");
    }
}

実行

開始ボタンを押して、フォーム上のラベルのテキストが「AAA」になっていればOKです

参考:プロジェクトファイルに追加された情報

VisualStudioが自動的に作成します
もちろん、手動で追加しても大丈夫ですが・・・

TransFileTestFW.csprojファイルをメモ帳で開いた様子の追加されたコード部分

たくさんのコードがありますが、自動追加の部分を抜粋しています

<ItemGroup>
  <Content Include="TextFile1.txt">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>

このコードは、.NETプロジェクトのプロジェクトファイル(例えば、.csproj.vbprojなど)内で使用されるXML要素の一部です。この特定の部分は、プロジェクトビルドプロセスの一環として特定のファイルを出力ディレクトリにコピーする方法を指定しています。詳しく見てみましょう:

  • <ItemGroup>: これは、プロジェクトファイル内で関連するアイテムをグループ化するために使用される要素です。アイテムは、コンパイルするソースファイル、プロジェクトに含めるリソースファイル、またはコピーするその他のファイルなど、様々なものがあり得ます。
  • <Content Include="TextFile1.txt">: この行は、TextFile1.txtという名前のファイルがプロジェクトの一部として含まれていることを示しています。Include属性は、プロジェクトディレクトリに対する相対パス、または絶対パスで指定されるファイルを指します。<Content>タグは、主にリソースファイル、データファイル、またはプロジェクトの実行やデプロイメントに必要なその他のファイルを指定するために使用されます。
  • <CopyToOutputDirectory>Always</CopyToOutputDirectory>: この行は、ビルドプロセスが実行されるたびに、TextFile1.txtを出力ディレクトリ(例えば、bin\Debugbin\Release)にコピーするように指示します。CopyToOutputDirectoryタグには、主に以下の3つの値が設定できます:
    • Always: ビルドのたびにファイルをコピーします。
    • PreserveNewest: ソースファイルが出力ディレクトリ内の既存のファイルよりも新しい場合にのみ、ファイルをコピーします。
    • Never: ファイルを自動的にコピーしません(デフォルトの振る舞い)。

この設定により、アプリケーションが実行される際に必要なファイルが常に出力ディレクトリに存在することが保証されます。これは、アプリケーションが外部ファイルを読み込む必要がある場合や、特定のファイルをデプロイメントパッケージに含めたい場合に特に便利です。