【C#】フォルダ操作の基本まとめ|作成・存在確認・一覧取得・削除まで初心者向けに解説
はじめに
C#では、フォルダの作成や存在確認、一覧取得、削除といった操作を、標準ライブラリの機能だけで簡単に実装できます。
フォルダ操作は、次のような場面でよく使われます。
アプリケーションの設定ファイルを保存する
ログファイル用のフォルダを作成する
指定したフォルダ内のデータを読み込む
バックアップ先のフォルダを準備する
不要になったフォルダを削除する
C#でフォルダを操作するときは、主にSystem.IO名前空間に含まれるDirectoryクラスやDirectoryInfoクラスを使用します。
この記事では、C#でフォルダ操作を行うための基礎知識を整理したうえで、Directory.CreateDirectoryメソッドを使ってフォルダを作成する方法を、初心者にもわかりやすく解説します。
1. C#でフォルダ操作を行う前に知っておきたい基本
C#でフォルダを操作する前に、使用するクラスやフォルダパスの指定方法を理解しておくことが重要です。
特にパスの書き方を間違えると、意図しない場所にフォルダが作成されたり、フォルダが見つからないエラーが発生したりします。
まずは、C#のフォルダ操作に必要な基本事項を確認しましょう。
1-1. C#のフォルダ操作で使う主なクラス
C#でファイルやフォルダを操作するときは、System.IO名前空間を使用します。
ソースコードの先頭に次のように記述すると、DirectoryやDirectoryInfoといったクラスを簡潔に呼び出せます。
C#using System.IO;
C#のフォルダ操作で主に使用するクラスは、次のとおりです。
| クラス | 主な用途 |
|---|---|
Directory | フォルダの作成、存在確認、一覧取得、削除など |
DirectoryInfo | 特定のフォルダをオブジェクトとして扱う |
Path | フォルダ名やファイル名を安全に結合する |
File | ファイルの作成、コピー、移動、削除など |
FileInfo | 特定のファイルをオブジェクトとして扱う |
例えば、フォルダを作成する場合はDirectory.CreateDirectory、フォルダが存在するか確認する場合はDirectory.Existsを使用します。
C#using System.IO;
string folderPath = @"C:\Sample\Data";
Directory.CreateDirectory(folderPath);
bool exists = Directory.Exists(folderPath);
Console.WriteLine(exists);
実行後、指定した場所にフォルダが存在していれば、Trueが表示されます。
なお、名前空間を省略せず、次のように完全修飾名で記述することも可能です。
C#System.IO.Directory.CreateDirectory(@"C:\Sample\Data");
ただし、同じソースコード内で何度も使用する場合は、using System.IO;を記述したほうが読みやすくなります。
1-2. DirectoryクラスとDirectoryInfoクラスの違い
C#でフォルダを操作する代表的なクラスには、DirectoryクラスとDirectoryInfoクラスがあります。
どちらもフォルダを扱うためのクラスですが、使い方が異なります。
Directoryクラスは、すべてのメソッドが静的メソッドとして用意されています。そのため、インスタンスを作成せずにフォルダを操作できます。
C#using System.IO;
Directory.CreateDirectory(@"C:\Sample\Data");
bool exists = Directory.Exists(@"C:\Sample\Data");
一方、DirectoryInfoクラスは、特定のフォルダを表すインスタンスを作成して使用します。
C#using System.IO;
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Sample\Data");
directoryInfo.Create();
Console.WriteLine(directoryInfo.FullName);
Console.WriteLine(directoryInfo.Exists);
両者の主な違いは次のとおりです。
| 比較項目 | Directory | DirectoryInfo |
|---|---|---|
| 使用方法 | 静的メソッドを直接呼び出す | インスタンスを作成して操作する |
| 向いている処理 | 単発のフォルダ操作 | 同じフォルダに対する複数の操作 |
| フォルダ情報の取得 | メソッドを個別に呼び出す | プロパティから取得できる |
| 記述例 | Directory.Exists(path) | directoryInfo.Exists |
フォルダの作成や存在確認を一度だけ行う場合は、Directoryクラスが手軽です。
一方、同じフォルダの名前、親フォルダ、作成日時などを繰り返し参照する場合は、DirectoryInfoクラスを利用するとコードを整理しやすくなります。
例えば、フォルダに関する情報は次のように取得できます。
C#using System.IO;
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Sample\Data");
Console.WriteLine($"フォルダ名: {directoryInfo.Name}");
Console.WriteLine($"フルパス: {directoryInfo.FullName}");
Console.WriteLine($"親フォルダ: {directoryInfo.Parent}");
Console.WriteLine($"存在するか: {directoryInfo.Exists}");
初心者のうちは、まずDirectoryクラスの使い方を覚え、必要に応じてDirectoryInfoクラスを使い分けるとよいでしょう。
1-3. フォルダパスの指定方法
C#でフォルダを操作するときは、操作対象となるフォルダのパスを文字列で指定します。
Windowsのフォルダパスを通常の文字列リテラルで記述する場合、バックスラッシュを2つ重ねる必要があります。
C#string folderPath = "C:\\Sample\\Data";
C#では、バックスラッシュがエスケープ文字として使用されるためです。
例えば、\nは改行、\tはタブを表します。そのため、Windowsのパスをそのまま記述すると、意図しないエスケープシーケンスとして解釈される可能性があります。
逐語的文字列リテラルを使用すると、パスをより直感的に記述できます。
C#string folderPath = @"C:\Sample\Data";
文字列の先頭に@を付けることで、バックスラッシュを1つだけ記述できます。
Windowsの固定パスを直接指定する場合は、逐語的文字列リテラルを使うと読みやすくなります。
ただし、フォルダ名を組み合わせてパスを作成する場合は、文字列を直接連結するのではなく、Path.Combineメソッドを使用するのがおすすめです。
C#using System.IO;
string baseFolder = @"C:\Sample";
string childFolder = "Data";
string folderPath = Path.Combine(baseFolder, childFolder);
Console.WriteLine(folderPath);
Windows環境では、次のようなパスが生成されます。
C:\Sample\Data
次のように、複数階層のパスをまとめて作成することもできます。
C#using System.IO;
string folderPath = Path.Combine(
@"C:\Sample",
"Data",
"2026",
"Reports"
);
Console.WriteLine(folderPath);
Path.Combineを使うと、区切り文字を自分で追加する必要がありません。WindowsとLinuxの両方で動作するアプリケーションを作成するときにも役立ちます。
.NET 6以降のコンソールアプリケーションなどでは、文字列補間を使ってパスを作ることもできます。
C#string folderName = "Data";
string folderPath = $@"C:\Sample\{folderName}";
ただし、文字列補間でパスを組み立てる方法は区切り文字の間違いが起こりやすいため、基本的にはPath.Combineの使用が安全です。
1-4. 相対パスと絶対パスの違い
フォルダパスには、大きく分けて絶対パスと相対パスがあります。
絶対パスとは、ドライブ名やルートディレクトリから始まる完全なパスです。
Windowsの絶対パスは、次のように記述します。
C#string folderPath = @"C:\Sample\Data";
Linuxの絶対パスは、次のようにルートを表す/から始まります。
C#string folderPath = "/home/user/sample/data";
絶対パスは、実行場所に関係なく同じフォルダを指定できる点が特徴です。ただし、特定のパソコンやOSに依存しやすいため、別の環境では同じパスが存在しない可能性があります。
一方、相対パスは、アプリケーションの現在の作業フォルダを基準にしたパスです。
C#string folderPath = "Data";
このコードでDirectory.CreateDirectoryを実行すると、現在の作業フォルダ内にDataフォルダが作成されます。
C#using System.IO;
string folderPath = "Data";
Directory.CreateDirectory(folderPath);
子フォルダを指定する場合は、Path.Combineを使います。
C#using System.IO;
string folderPath = Path.Combine("Data", "Reports");
Directory.CreateDirectory(folderPath);
相対パスの基準となる現在の作業フォルダは、Directory.GetCurrentDirectoryメソッドで確認できます。
C#using System.IO;
string currentDirectory = Directory.GetCurrentDirectory();
Console.WriteLine(currentDirectory);
注意したいのは、現在の作業フォルダが必ずしも実行ファイルの保存先とは限らないことです。
Visual Studioから実行した場合、プロジェクトの設定や実行方法によって作業フォルダが変わる可能性があります。相対パスで作成したフォルダが見つからない場合は、最初にDirectory.GetCurrentDirectoryの結果を確認しましょう。
アプリケーションの実行ファイルが置かれている場所を基準にしたい場合は、AppContext.BaseDirectoryを使用できます。
C#using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
Directory.CreateDirectory(folderPath);
絶対パスと相対パスには、それぞれ次のような特徴があります。
| 種類 | 特徴 | 記述例 |
|---|---|---|
| 絶対パス | 保存場所を完全に指定する | C:\Sample\Data |
| 相対パス | 現在の作業フォルダを基準にする | Data\Reports |
特定の保存先を明確に指定したい場合は絶対パス、アプリケーションの配置場所に応じて柔軟に変更したい場合は相対パスが適しています。
1-5. WindowsとLinuxで異なるパス区切り文字への注意点
WindowsとLinuxでは、一般的に使用されるパスの区切り文字が異なります。
Windowsではバックスラッシュを使用します。
C:\Sample\Data
Linuxではスラッシュを使用します。
/home/user/sample/data
Windows専用のアプリケーションであれば、次のようにバックスラッシュを直接記述しても動作します。
C#string folderPath = @"C:\Sample\Data";
しかし、WindowsとLinuxの両方で動作させる可能性がある場合、区切り文字を固定してパスを作成する方法は避けたほうが安全です。
複数のフォルダ名を組み合わせる場合は、Path.Combineを使用します。
C#using System.IO;
string folderPath = Path.Combine("Sample", "Data", "Reports");
Console.WriteLine(folderPath);
Path.Combineは、実行環境に応じた区切り文字を使用してパスを生成します。そのため、OSごとにパスの作成処理を書き分ける必要がありません。
現在のOSで使用される区切り文字は、Path.DirectorySeparatorCharで取得できます。
C#using System.IO;
char separator = Path.DirectorySeparatorChar;
Console.WriteLine(separator);
Windowsでは\、Linuxでは/が返されます。
区切り文字を自分で使う必要がある場合は、次のように記述できます。
C#using System.IO;
string folderPath =
$"Sample{Path.DirectorySeparatorChar}Data";
Console.WriteLine(folderPath);
ただし、通常はPath.DirectorySeparatorCharを使って手動で連結するより、Path.Combineを使うほうが簡潔です。
また、WindowsとLinuxでは、区切り文字以外にもファイル名やフォルダ名の扱いが異なります。
例えば、多くのWindows環境では、大文字と小文字を区別せずにパスを扱います。
Data
data
一方、多くのLinux環境では、上記は別のフォルダとして扱われます。
クロスプラットフォーム対応のアプリケーションでは、フォルダ名の大文字と小文字を統一し、OS固有の絶対パスをソースコードへ直接埋め込まないことが重要です。
2. C#でフォルダを作成する方法
C#でフォルダを作成する場合は、Directory.CreateDirectoryメソッドを使用します。
基本構文は次のとおりです。
C#Directory.CreateDirectory(フォルダパス);
引数には、作成したいフォルダのパスを文字列で指定します。
Directory.CreateDirectoryは、指定したフォルダがすでに存在していても、通常は例外を発生させません。そのため、事前に存在確認を行わなくても安全に呼び出せます。
2-1. Directory.CreateDirectoryでフォルダを作成する
次のコードでは、C:\Sampleの中にDataフォルダを作成します。
C#using System;
using System.IO;
string folderPath = @"C:\Sample\Data";
Directory.CreateDirectory(folderPath);
Console.WriteLine("フォルダを作成しました。");
指定したフォルダが存在しない場合は、新しいフォルダが作成されます。
指定したフォルダがすでに存在する場合は、既存のフォルダがそのまま使用されます。フォルダの中にあるファイルや子フォルダが削除されることもありません。
相対パスでフォルダを作成する場合は、次のように記述します。
C#using System;
using System.IO;
string folderPath = "Data";
Directory.CreateDirectory(folderPath);
Console.WriteLine(
$"フォルダを作成しました: {Path.GetFullPath(folderPath)}"
);
Path.GetFullPathを使用すると、相対パスを絶対パスへ変換して確認できます。
複数階層のフォルダをまとめて作成することも可能です。
C#using System;
using System.IO;
string folderPath = Path.Combine(
"Data",
"2026",
"Reports"
);
Directory.CreateDirectory(folderPath);
Console.WriteLine(
$"フォルダを作成しました: {Path.GetFullPath(folderPath)}"
);
このコードを実行した時点でDataや2026フォルダが存在していなくても、必要な親フォルダを含めて作成されます。
作成されたフォルダの情報を使用したい場合は、Directory.CreateDirectoryの戻り値を受け取ります。
戻り値は、作成または取得されたフォルダを表すDirectoryInfoオブジェクトです。
C#using System;
using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
DirectoryInfo directoryInfo =
Directory.CreateDirectory(folderPath);
Console.WriteLine($"フォルダ名: {directoryInfo.Name}");
Console.WriteLine($"フルパス: {directoryInfo.FullName}");
Console.WriteLine($"存在するか: {directoryInfo.Exists}");
フォルダの作成前後を明確に区別したい場合は、Directory.Existsで存在確認を行います。
C#using System;
using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
if (Directory.Exists(folderPath))
{
Console.WriteLine("フォルダはすでに存在します。");
}
else
{
Directory.CreateDirectory(folderPath);
Console.WriteLine("フォルダを新しく作成しました。");
}
ただし、存在確認を行った直後に別の処理や別のアプリケーションがフォルダを作成・削除する可能性があります。そのため、存在確認だけに頼らず、必要に応じて例外処理も実装しましょう。
C#using System;
using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
try
{
DirectoryInfo directoryInfo =
Directory.CreateDirectory(folderPath);
Console.WriteLine(
$"フォルダを使用できます: {directoryInfo.FullName}"
);
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine(
$"フォルダを作成する権限がありません: {ex.Message}"
);
}
catch (ArgumentException ex)
{
Console.WriteLine(
$"フォルダパスが正しくありません: {ex.Message}"
);
}
catch (PathTooLongException ex)
{
Console.WriteLine(
$"フォルダパスが長すぎます: {ex.Message}"
);
}
catch (IOException ex)
{
Console.WriteLine(
$"入出力エラーが発生しました: {ex.Message}"
);
}
Directory.CreateDirectoryでフォルダを作成するときは、主に次のような原因で例外が発生する可能性があります。
フォルダを作成する権限がない
パスに使用できない文字が含まれている
パスが長すぎる
同じ名前のファイルがすでに存在する
ドライブや保存先が利用できない
ネットワーク上の保存先へ接続できない
例えば、C:\直下やシステムフォルダなど、実行ユーザーに書き込み権限がない場所を指定すると、UnauthorizedAccessExceptionが発生することがあります。
一般的なデスクトップアプリケーションでは、ユーザーごとのデータフォルダを利用する方法もあります。
C#using System;
using System.IO;
string localAppData = Environment.GetFolderPath(
Environment.SpecialFolder.LocalApplicationData
);
string folderPath = Path.Combine(
localAppData,
"SampleApp",
"Data"
);
Directory.CreateDirectory(folderPath);
Console.WriteLine(folderPath);
この方法では、Windows環境におけるユーザーごとのローカルアプリケーションデータフォルダを基準に保存先を作成できます。
実行ファイルと同じ場所にフォルダを作成する場合は、AppContext.BaseDirectoryとPath.Combineを組み合わせます。
C#using System;
using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
Directory.CreateDirectory(folderPath);
Console.WriteLine($"作成先: {folderPath}");
ただし、アプリケーションが書き込み権限のない場所にインストールされている場合、実行ファイルと同じフォルダには書き込めないことがあります。
保存先を決める際は、アプリケーションの用途や実行環境を考慮することが大切です。
まとめ
C#でフォルダを操作するときは、主にSystem.IO名前空間のDirectoryクラスを使用します。
フォルダを作成する基本的なコードは、次のとおりです。
C#using System.IO;
string folderPath = Path.Combine(
AppContext.BaseDirectory,
"Data"
);
Directory.CreateDirectory(folderPath);
Directory.CreateDirectoryは、指定したフォルダが存在しない場合に新しく作成します。すでに存在する場合でも通常は例外が発生しないため、フォルダを確実に用意したい処理に適しています。
C#でフォルダ操作を実装するときは、次の点を押さえておきましょう。
単発の操作には
Directoryクラスを使用する同じフォルダの情報を繰り返し扱う場合は
DirectoryInfoを使用するWindowsの固定パスには逐語的文字列リテラルを利用できる
パスの組み立てには
Path.Combineを使用する相対パスの基準は
Directory.GetCurrentDirectoryで確認するWindowsとLinuxの両方に対応する場合は区切り文字を固定しない
権限不足や不正なパスに備えて例外処理を実装する
まずはDirectory.CreateDirectoryを使ったフォルダ作成から試し、C#のフォルダ操作に慣れていきましょう。

