フォルダの操作方法について知りたい。。。
フォルダの作成、移動、削除、存在チェック、パス取得などの操作は、C# では .NET に標準で用意されている System.IO.Directory クラスに定義されているメソッドを使います。
アプリケーションの開発ではフォルダを操作する機会は多く、よく使うものを1つの記事に纏めてみました。
サンプルコードも紹介していますので、参考にしてみて下さい。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
フォルダを操作するには
C#でフォルダ(ディレクトリ)を操作するには、Directory クラスの静的なメソッドを使用します。
このクラスには、フォルダの作成、移動、削除、名前変更などが行えるメソッドが存在します。
\ Microsoftのドキュメント /
また、これらのメソッドは静的なメソッドなので、クラスをインスタンス化することなく、単にメソッドを呼び出すだけで利用できます。
ファイルの操作についても知りたい方は、次のリンクから確認してみて下さい。
フォルダの操作まとめ
Visual Studio を起動して新規プロジェクトを作成します。ここではプロジェクト名を FolderSample とします。
Directoryクラスは「System.IO」名前空間に存在するので、コード先頭のusingディレクティブに以下を追加しておきましょう。
using System.IO;
System.IO にはフォルダの操作の他にファイルを操作するためのクラスも提供されています。
フォルダを作成する
フォルダを新規作成する場合は CreateDirectory メソッドを使います。
第1引数はフォルダの名前またはパスを指定します。フォルダの名前を指定した場合は、アプリケーションの実行ファイルがある場所に作られます。
CreateDirectory(フォルダ名);
以下のコードは「Sample」フォルダを作成するサンプルです。もし、フォルダが既に存在した場合、新しいフォルダは作成されません。
// Sampleフォルダを作成する
Directory.CreateDirectory("Sample");
└─bin
└─Sample
また、新しいフォルダ(親フォルダ)の中に、更に新しいフォルダ(子フォルダ)を作成することも可能です。この場合、子フォルダのパスを入力します。もし親フォルダが存在しなかったなら、親フォルダは自動で作成されます。
// Sampleフォルダの中にTempフォルダを作成する
// もしSampleフォルダが存在しない場合は自動で作成される
Directory.CreateDirectory(@"Sample\Temp");
└─bin
└─Sample
└─Temp
フォルダを移動する(名前を変更する)
フォルダを移動する場合は Move メソッドを使います。
第1引数は移動元となるフォルダの名前またはパスを指定します。第2引数は移動先となるフォルダの名前またはパスを指定します。
このメソッドは、別のドライブへ移動することはできないので注意しましょう。同じドライブ内でしか移動ができません。
Move(移動元のフォルダ名, 移動先のフォルダ名);
以下のコードは「Sample」というフォルダから「Temp」というフォルダへ移動するサンプルです。移動するというよりは名前を変更すると言った方が正しいかもしれません。
// SampleフォルダをTempフォルダへ移動する(名前を変更する)
Directory.Move("Sample", "Temp");
└─bin
└─Temp
フォルダを削除する
フォルダを削除する場合は Delete メソッドを使います。
第1引数はフォルダの名前またはパスを指定します。第2引数はフォルダ内のフォルダやサブフォルダを削除するかどうかを指定します。
第2引数が true ならフォルダ内のファイルやサブフォルダをまとめて削除します。false なら第1引数で指定したフォルダのみ削除されます。ここで注意したいのが、フォルダ内が空ではなかった場合は削除できず、IOException 例外が発生します。
Delete(フォルダ名, フォルダ内部の削除有無);
以下のコードは「Sample」というフォルダ削除するサンプルです。
Directory.Delete("Sample", true);
└─bin
フォルダの存在確認をする
フォルダの存在確認をする場合は Exists メソッドを使います。
第1引数はフォルダの名前またはパスを指定します。ここで指定したフォルダの名前またはパスが存在するかどうかを確認できます。
戻り値はフォルダが存在するかどうかの結果です。true ならフォルダは存在し、false ならフォルダは存在しないか判定中にエラーが発生しています。
フォルダの有無 = Exists(フォルダ名);
以下のコードは「Sample」というフォルダが存在するかどうかをチェックするサンプルです。
if (Directory.Exists("Sample"))
{
Debug.WriteLine("フォルダは存在します");
}
else
{
Debug.WriteLine("フォルダは存在しません");
}
サブフォルダ一覧を取得する
サブフォルダを取得する場合は EnumerateDirectories メソッドを使います。GetDirectories メソッドも同じ処理をしますが戻り値の型が異なります。
戻り値は取得したサブフォルダのパス一覧(型:IEnumerable<String>)です。ただし、サブフォルダの中にあるフォルダまで取得はできません。
EnumerateDirectories(フォルダ名);
以下のコードは「Sample」フォルダの中にあるサブフォルダをすべて取得するサンプルです。
var folders = Directory.EnumerateDirectories("Sample");
foreach (var folder in folders)
{
Debug.WriteLine(folder);
}
Sampleフォルダには次のフォルダとファイルが格納されているとします。
└─bin
└─Sample
├─data1.csv
├─data2.csv
└─Temp
└─memo.txt
実行すると次の結果になります。
Sample\Temp
フォルダ内のファイル一覧を取得する
フォルダ内のファイルを取得する場合は EnumerateFiles メソッドを使います。GetFiles メソッドも同じ処理をしますが戻り値の型が異なります。
第1引数はファイルを取得したいフォルダの名前またはパスを指定します。
戻り値は取得したファイル名の一覧(型:IEnumerable<String>)です。ただし、子フォルダの中にあるファイルまで取得はできません。
EnumerateFiles(フォルダ名);
以下のコードは「Sample」フォルダの中にあるファイル名をすべて取得するサンプルです。
var files = Directory.EnumerateFiles("Sample");
foreach (var file in files)
{
Debug.WriteLine(file);
}
Sampleフォルダには次のフォルダとファイルが格納されているとします。
└─bin
└─Sample
├─data1.csv
├─data2.csv
└─Temp
└─memo.txt
実行すると次の結果になります。
Sample\data1.csv
Sample\data2.csv
また、取得するファイル名にフィルタをかけたい場合は、第2引数を利用します。
EnumerateFiles(フォルダ名, 検索文字列);
有効なリテラルのパスとワイルドカード文字の組み合わせを含めることができます。ワイルドカード文字では、次のワイルドカード指定子を利用できます。
ワイルドカード指定子 | 内容 |
* (アスタリスク) | その位置の 0 個以上の文字 |
? (疑問符) | その位置の 1 文字だけ |
例えば、第2引数が “s*” なら、文字 “s” で始まるすべての名前を検索します。第2引数が “?.ai” なら、文字 “a.ai” や “b.ai” など拡張子の前の文字が1文字の名前を検索します。
以下のコードは「Sample」というフォルダの中にあるテキストファイルだけを取得するサンプルです。
var files = Directory.EnumerateFiles("Sample", "*.txt");
foreach (var file in files)
{
Debug.WriteLine(file);
}
実行すると次の結果になります。
Sample\memo1.txt
Sample\memo2.txt
Sample\memo3.txt
テキストファイルだけを取得することができました。
使用例
次のコードでは、フォルダの作成、移動、削除を行う簡単なサンプルを記述しています。
フォルダの操作は比較的エラーの起きやすい処理です。フォルダ操作中にエラーが発生して例外がスローされた場合に備えて、try-catch 文を記述して例外に対する処理を行うといいでしょう。
// 作成するフォルダの名前
var sourceDirectory = "Sample";
// 移動先のフォルダの名前
var destinationDirectory = "Temp";
try
{
// フォルダが存在するかどうか確認
if (!Directory.Exists(sourceDirectory))
{
// Sampleフォルダを作成
var info = Directory.CreateDirectory(sourceDirectory);
Debug.WriteLine($"{info.Name}フォルダの作成日時:{info.CreationTime}"); ;
}
// フォルダの移動(名前変更)
Directory.Move(sourceDirectory, destinationDirectory);
// 実行ファイルがあるフォルダのパスを取得し、その階層のフォルダを全て取得
var folders = Directory.EnumerateDirectories(Directory.GetCurrentDirectory());
foreach (var folder in folders)
{
// フォルダの削除
Directory.Delete(folder, true);
Debug.WriteLine($"{folder}フォルダの削除完了");
}
}
catch (Exception ex)
{
Debug.WriteLine($"例外: {ex.Message}");
}
まとめ
この記事では、フォルダの作成、移動、削除などの操作方法を紹介しました。
C# では .NET に標準で用意されている System.IO.Directory クラスを使うことで、お手軽にフォルダ操作が可能です。フォルダを操作する機会があれば参考にしてみて下さい。
以上、最後まで読んで頂きありがとうございました。