1. 導入
ユーザーが写真をアップロードするプログラムを作っていると想像してみてください。ファイルを1つのフォルダに「ごちゃまぜ」で置くより、日付別やユーザー名別にディレクトリを作る方がいいですよね。あるいは、アプリがレポートを生成するなら、結果を専用のディレクトリに入れるのが自然で、そのディレクトリは実行時に作成する必要があります。処理の後に一時フォルダを削除するのは、ちゃんとしたコードの責務であり、ユーザーにとってもゴミを減らすことになります。
ディレクトリ操作は、バックアップからセーブデータをフォルダに整理するゲームまで、多くのアプリで必須の作業です。面接でもよく出るトピックで、単に「作る」「消す」だけでなく、例外的な状況でどう振る舞うかを理解しているかが問われます。
ディレクトリ(フォルダ)は、ファイルシステム内で他のファイルやディレクトリを格納するコンテナです。ディレクトリはツリー構造(filesystem tree)を形成し、各フォルダにはルートを除いて親があり、子フォルダをたくさん持てます。
2. フォルダを作るには? 静的クラス Directory
最も簡単なフォルダ作成方法は、静的メソッド Directory.CreateDirectory を使うことです。オブジェクトを作る必要はなく、パスを渡すだけです:
using System.IO;
// 現在のディレクトリに "Reports" フォルダを作成する
Directory.CreateDirectory("Reports");
そのようなフォルダが既にある場合、メソッドは何もしませんし例外も投げません — CreateDirectory を存在確認なしに呼んでも安全です。
もっと複雑なパス、例えばネストされたフォルダを作る場合を試してみましょう:
Directory.CreateDirectory(@"Data\Photos\2024\June");
この呼び出しは、中間のフォルダが存在しなければチェーン全体を作成します。これは再帰的な作成と呼ばれ、Directory.CreateDirectory が自動的に処理してくれます。
重要! ディレクトリのパスでは Windows の場合はバックスラッシュを二重に (\\)、またはスラッシュ (/) を使ってください。さらに良いのは、前に学んだ Path.Combine を使うことです。
CreateDirectory は何を返す?
メソッドは DirectoryInfo 型のオブジェクトを返します。作成したディレクトリをすぐに操作したい場合に便利です:
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"作成したフォルダ: {reportsDir.FullName}");
フォルダが存在するかをどうやって知る?
ディレクトリに対して何か操作をする際、事前に存在を確認したい場合があります。そのための静的メソッドがあります:
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("フォルダが見つかりません。これから作成します!");
Directory.CreateDirectory("Reports");
}
覚えておくこと: 作成前の確認は必須ではありません:フォルダがあってもメソッドは壊れません。ただしユーザー向けのメッセージ表示や、処理を分岐させたい場合には役立ちます。
3. ディレクトリ作成の実用ケース
学習用アプリと組み合わせて考えてみましょう。ユーザーのレコードを管理していて、各ユーザーごとにフォルダを作りたいとします:
// ファイル上部に System.IO を追加しておく
using System.IO;
Console.Write("ユーザー名を入力してください: ");
string userName = Console.ReadLine() ?? "Unknown";
// ユーザー用フォルダのパスを組み立てる
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// ユーザー用フォルダ(必要なら親も)を作成する
Directory.CreateDirectory(userPath);
Console.WriteLine($"ユーザー用フォルダ \"{userName}\" を用意しました: {Path.GetFullPath(userPath)}");
上の例は、構造がなければ次のように作成します:
UsersData/
└── ユーザー名/
アドバイス: パスを結合するときは常に Path.Combine を使ってください — そうすればコードは Windows でも Linux/Mac でも動きます。
4. フォルダを削除するには? メソッド Directory.Delete
フォルダの削除は作成とほぼ同じくらい簡単ですが、注意点があります。
Directory.Delete("Reports");
フォルダが存在して空であれば問題なく削除されます。しかし中に何かあると例外が投げられます:
System.IO.IOException: "The directory is not empty."
中身ごと削除したい場合は?
そのためのオーバーロードがあり、パラメータ recursive: true を渡します:
Directory.Delete("Reports", recursive: true);
注意: 再帰的削除はフォルダ内のすべてを不可逆に消します。間違ったディレクトリを指定すると重要なデータを失う可能性があります。パスは必ず二重チェックしてください!
例
ユーザーがアカウントを削除した場合のように、ユーザー用フォルダを削除する機能を追加してみます:
// 削除するか確認する
Console.Write("ユーザーのフォルダを削除しますか? (y/n): ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// 中身ごと削除する
Directory.Delete(userPath, recursive: true);
Console.WriteLine("ユーザーのフォルダを削除しました!");
}
else
{
Console.WriteLine("フォルダは既に存在しません。");
}
}
5. 表: フォルダ操作の主なメソッド
| 操作 | メソッド | 特徴 |
|---|---|---|
| フォルダを作成 | |
パスの途中にあるフォルダも再帰的に作成する |
| 存在を確認 | |
true または false を返す |
| 空のフォルダを削除 | |
フォルダが空でないと例外を投げる |
| 中身ごと削除 | |
内部のすべてを不可逆に消す |
| ファイル一覧を取得 | |
ファイル名の配列を返す |
| サブフォルダ一覧を取得 | |
ディレクトリ名の配列を返す |
6. 見落としがちな点と典型的なミス
作成時のエラー: 権限がないかパスが不正な場合
システムディレクトリ(例: "C:\Windows\System32\SuperApp")にフォルダを作ろうとすると、UnauthorizedAccessException や IOException が発生することがあります。
実用的なアドバイス:
外部メディアやネットワークドライブなど外部のフォルダを扱うときは、必ず try-catch で例外を処理してください。
ユーザー入力されたパスをそのまま信頼しないでください。
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"フォルダを作成できませんでした: {ex.Message}");
}
他のプロセスが使っているときの削除エラー
フォルダ内のファイルが誰か(あるいは自分のプログラム)が開いてロックしていると、削除の試行で IOException が発生します。先にフォルダ内のファイルをすべて閉じてください。
フォルダが空でないのに recursive: true を忘れる
よくあるミスです。recursive: true を渡さないと、フォルダが空でない場合は例外になります。
重要な操作には絶対パスを使う
相対パス(例: "Reports")は常にアプリのカレントワーキングディレクトリを基準に動作します。プログラムが別の場所から実行されると、期待した場所にフォルダが作られないことがあります。どこから起動されているか確認するか、最初から絶対パスを指定してください:
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
GO TO FULL VERSION