C# Directory.Existsの使い方|フォルダ存在チェックと戻り値・例外対策を解説

はじめに

C#でフォルダの存在を確認したいときによく使うのが、System.IO.Directory.Existsメソッドです。指定したパスが既存のディレクトリを指しているかどうかをbool型で判定できるため、ファイル保存前のチェック、ログ出力先の確認、設定フォルダの作成前判定など、さまざまな場面で利用されます。

ただし、Directory.Existsは単に「フォルダがあるかどうか」を見るだけのメソッドではありません。パスがnullや空文字だった場合、不正なパスだった場合、アクセス権限がない場合などには、例外ではなくfalseが返ることがあります。そのため、戻り値の意味を正しく理解し、後続処理では例外対策も組み合わせることが大切です。Microsoftの公式ドキュメントでも、Directory.Existsは指定パスが既存のディレクトリを参照しているかを確認するメソッドとして説明されています。Microsoft Learn

1. C#のDirectory.Existsとは

1-1. Directory.Existsでできること

Directory.Existsは、指定したパスにフォルダが存在するかどうかを確認するためのメソッドです。戻り値はtrueまたはfalseで、フォルダが存在すればtrue、存在しなければfalseになります。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string path = @"C:\Work";

bool exists = Directory.Exists(path);

Console.WriteLine(exists);
}
}

このコードでは、C:\Workというフォルダが存在するかどうかを調べています。存在すればTrue、存在しなければFalseが表示されます。

1-2. フォルダの存在チェックが必要になる場面

フォルダの存在チェックは、実務でもよく使われます。たとえば、次のようなケースです。

C#
string saveFolder = @"C:\Work\Output";

if (Directory.Exists(saveFolder))
{
Console.WriteLine("保存先フォルダがあります。");
}
else
{
Console.WriteLine("保存先フォルダがありません。");
}

ファイルを保存する前に保存先フォルダが存在するか確認したり、ログ出力先が用意されているかチェックしたり、ユーザーが入力したパスが正しいフォルダか検証したりする場面で役立ちます。

1-3. File.Existsとの違い

Directory.Existsはフォルダの存在確認に使います。一方、File.Existsはファイルの存在確認に使います。

C#
string folderPath = @"C:\Work";
string filePath = @"C:\Work\sample.txt";

bool folderExists = Directory.Exists(folderPath);
bool fileExists = File.Exists(filePath);

Directory.Existsにファイルのパスを渡しても、フォルダとして存在していなければfalseになります。同様に、File.Existsにフォルダのパスを渡してもfalseになります。MicrosoftのFile.Existsドキュメントでも、パスがディレクトリを表している場合はfalseを返すと説明されています。Microsoft Learn

1-4. 使用に必要な名前空間System.IO

Directory.Existsを使うには、System.IO名前空間を使用します。

C#
using System.IO;

完全修飾名で書くこともできます。

C#
bool exists = System.IO.Directory.Exists(@"C:\Work");

ただし、通常はファイル操作やフォルダ操作を行うコードではusing System.IO;を先頭に書いておくと読みやすくなります。

2. Directory.Existsの基本的な使い方

2-1. 基本構文

Directory.Existsの基本構文は次のとおりです。

C#
bool result = Directory.Exists(path);

pathには確認したいフォルダのパスを文字列で指定します。

C#
string path = @"C:\Work";
bool result = Directory.Exists(path);

2-2. 戻り値はbool型

Directory.Existsの戻り値はbool型です。フォルダが存在する場合はtrue、存在しない場合はfalseです。

C#
string path = @"C:\Work";

if (Directory.Exists(path))
{
Console.WriteLine("フォルダは存在します。");
}
else
{
Console.WriteLine("フォルダは存在しません。");
}

Directory.Existsは条件式としてそのまま使えるため、if文と組み合わせる書き方が一般的です。

2-3. フォルダが存在する場合のサンプルコード

次の例では、対象フォルダが存在する場合にメッセージを表示します。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string path = @"C:\Windows";

if (Directory.Exists(path))
{
Console.WriteLine("フォルダが存在します。");
}
}
}

Windows環境でC:\Windowsが存在する場合、フォルダが存在します。と表示されます。

2-4. フォルダが存在しない場合のサンプルコード

存在しないフォルダを指定した場合は、falseが返ります。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string path = @"C:\NoSuchFolder";

if (!Directory.Exists(path))
{
Console.WriteLine("フォルダが存在しません。");
}
}
}

!Directory.Exists(path)と書くことで、「フォルダが存在しない場合」という条件を表せます。

2-5. if文で存在チェックする書き方

実務では、存在する場合と存在しない場合で処理を分けることが多いです。

C#
string folderPath = @"C:\Work\Reports";

if (Directory.Exists(folderPath))
{
Console.WriteLine("レポートフォルダに保存できます。");
}
else
{
Console.WriteLine("レポートフォルダが見つかりません。");
}

このように、Directory.Existsはフォルダを使う前の事前チェックとして簡潔に書けます。

3. Directory.Existsの戻り値と判定仕様

3-1. trueが返るケース

Directory.Existstrueを返すのは、指定したパスが実際に存在するディレクトリを指している場合です。

C#
string path = @"C:\Work";

if (Directory.Exists(path))
{
Console.WriteLine("存在するディレクトリです。");
}

ここで重要なのは、対象が「ファイル」ではなく「ディレクトリ」であることです。存在するファイルのパスを指定しても、ディレクトリではないためtrueにはなりません。

3-2. falseが返るケース

Directory.Existsは、次のような場合にfalseを返します。

C#
Console.WriteLine(Directory.Exists(@"C:\NoSuchFolder"));
Console.WriteLine(Directory.Exists(@"C:\Work\sample.txt"));
Console.WriteLine(Directory.Exists(""));
Console.WriteLine(Directory.Exists(null));

存在しないフォルダ、ファイルのパス、空文字、nullなどはfalseになります。また、アクセス権限がない場合やディスクに問題がある場合など、存在確認中にエラーが起きるケースでもfalseが返ることがあります。公式ドキュメントでも、無効な文字、文字数が多すぎるパス、ディスク障害、権限不足などの状況ではfalseを返す可能性があると説明されています。Microsoft Learn

3-3. null・空文字・不正なパスを指定した場合

Directory.Existsでは、nullや空文字を指定しても、通常は例外ではなくfalseになります。

C#
string nullPath = null;
string emptyPath = "";

Console.WriteLine(Directory.Exists(nullPath)); // False
Console.WriteLine(Directory.Exists(emptyPath)); // False

ただし、これは「安全に使ってよい」という意味ではありません。ユーザー入力値をそのまま渡すと、意図しない判定や後続処理のエラーにつながる可能性があります。

C#
string input = "";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("パスが入力されていません。");
}
else if (Directory.Exists(input))
{
Console.WriteLine("フォルダが存在します。");
}
else
{
Console.WriteLine("フォルダが存在しません。");
}

ユーザー入力を扱う場合は、先にstring.IsNullOrWhiteSpaceなどで基本的な検証を行うと安全です。

3-4. アクセス権限がない場合の挙動

アクセス権限がないフォルダに対してDirectory.Existsを呼び出すと、環境や権限の状態によってfalseが返ることがあります。つまり、falseだからといって必ず「フォルダが存在しない」と断定できるわけではありません。

C#
string path = @"C:\System Volume Information";

if (!Directory.Exists(path))
{
Console.WriteLine("存在しない、または確認する権限がありません。");
}

権限不足とフォルダ不存在を厳密に区別したい場合は、Directory.Existsだけでは不十分です。実際にアクセスする処理をtry-catchで囲み、UnauthorizedAccessExceptionなどを処理する必要があります。

3-5. 例外ではなくfalseになるケースに注意

Directory.Existsは、存在確認時の多くの問題を例外ではなくfalseとして返します。そのため、次のようなコードでは注意が必要です。

C#
if (!Directory.Exists(path))
{
Console.WriteLine("フォルダがないので作成します。");
Directory.CreateDirectory(path);
}

一見問題なさそうですが、Directory.Exists(path)が権限不足でfalseを返している場合、Directory.CreateDirectory(path)で例外が発生する可能性があります。存在チェックはあくまで事前確認であり、その後の作成・削除・保存などの処理では別途例外対策が必要です。

4. パス指定の実践ポイント

4-1. 絶対パスでフォルダをチェックする

絶対パスは、ドライブ名やルートから始まる完全なパスです。

C#
string path = @"C:\Work\Data";

if (Directory.Exists(path))
{
Console.WriteLine("フォルダが存在します。");
}

絶対パスは基準が明確なため、意図しない場所を参照しにくいというメリットがあります。設定ファイルやログ保存先など、場所を固定したい場合に向いています。

4-2. 相対パスでフォルダをチェックする

相対パスも指定できます。

C#
string path = @"Data";

if (Directory.Exists(path))
{
Console.WriteLine("Dataフォルダが存在します。");
}

相対パスは、現在の作業ディレクトリを基準に解釈されます。File.Existsの公式ドキュメントでも、相対パス情報は現在の作業ディレクトリに対する相対パスとして解釈されると説明されています。Microsoft Learn

現在の作業ディレクトリを確認したい場合は、次のように書きます。

C#
Console.WriteLine(Directory.GetCurrentDirectory());

4-3. アプリケーション実行フォルダ基準で指定する

アプリケーションの実行フォルダを基準にしたい場合は、AppContext.BaseDirectoryを使うと分かりやすくなります。

C#
string baseDir = AppContext.BaseDirectory;
string dataDir = Path.Combine(baseDir, "Data");

if (Directory.Exists(dataDir))
{
Console.WriteLine("実行フォルダ配下のDataフォルダが存在します。");
}

相対パスをそのまま使うと、実行方法や起動元によって基準が変わることがあります。アプリケーション配下のフォルダを参照したい場合は、基準となるパスを明示しましょう。

4-4. パス区切り文字の書き方

Windowsのパスではバックスラッシュ\を使います。ただし、C#の文字列では\がエスケープ文字として扱われるため、次のどちらかの書き方をします。

C#
string path1 = "C:\\Work\\Data";
string path2 = @"C:\Work\Data";

@を付けた逐語的文字列リテラルを使うと、バックスラッシュをそのまま書けるため、Windowsパスではよく使われます。

4-5. Path.Combineを使って安全にパスを作る

パスを文字列連結で作ると、区切り文字の不足や重複が起きやすくなります。

C#
string badPath = baseDir + "\\Data";

このような書き方より、Path.Combineを使うのがおすすめです。

C#
string baseDir = AppContext.BaseDirectory;
string dataDir = Path.Combine(baseDir, "Data");

Console.WriteLine(dataDir);

Path.Combineは複数の文字列を結合してパスを作るメソッドです。公式ドキュメントでも、個々の文字列を1つのファイルパスに連結するためのメソッドとして説明されています。Microsoft Learn

4-6. 日本語フォルダ名やスペースを含むパスの扱い

日本語やスペースを含むパスでも、文字列として正しく指定すればDirectory.Existsで確認できます。

C#
string path = @"C:\作業フォルダ\売上 データ";

if (Directory.Exists(path))
{
Console.WriteLine("日本語やスペースを含むフォルダも確認できます。");
}

ただし、コマンドライン引数や設定ファイルからパスを受け取る場合は、前後に余分な空白や引用符が含まれていないか注意しましょう。

C#
string input = "\"C:\\作業フォルダ\\売上 データ\"";
string path = input.Trim().Trim('"');

if (Directory.Exists(path))
{
Console.WriteLine("フォルダが存在します。");
}

5. Directory.Existsを使った実用コード例

5-1. 存在しないフォルダを作成する

フォルダが存在しない場合に作成する例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string folderPath = @"C:\Work\Output";

if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
Console.WriteLine("フォルダを作成しました。");
}
else
{
Console.WriteLine("フォルダは既に存在します。");
}
}
}

ただし、フォルダ作成が目的であれば、必ずしも事前にDirectory.Existsを呼ぶ必要はありません。Directory.CreateDirectoryは、指定したディレクトリやサブディレクトリが存在しない場合に作成し、既に存在する場合でも対象ディレクトリを表すDirectoryInfoを返します。Microsoft Learn

C#
Directory.CreateDirectory(folderPath);

この1行でも、フォルダがなければ作成され、既に存在していればそのまま扱えます。

5-2. フォルダが存在する場合だけファイルを保存する

保存先フォルダが存在する場合だけファイルを書き込む例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string folderPath = @"C:\Work\Output";
string filePath = Path.Combine(folderPath, "result.txt");

if (Directory.Exists(folderPath))
{
File.WriteAllText(filePath, "保存する内容");
Console.WriteLine("ファイルを保存しました。");
}
else
{
Console.WriteLine("保存先フォルダが存在しません。");
}
}
}

このコードでは、フォルダがない状態でファイル保存を実行しないようにしています。ただし、存在チェック後にフォルダが削除される可能性もあるため、実際の保存処理ではtry-catchも検討しましょう。

5-3. ログ出力先フォルダを事前にチェックする

ログ出力先フォルダがない場合に作成してからログを書き込む例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string logDir = Path.Combine(AppContext.BaseDirectory, "logs");
string logFile = Path.Combine(logDir, "app.log");

Directory.CreateDirectory(logDir);

File.AppendAllText(logFile, $"{DateTime.Now}: アプリを開始しました。{Environment.NewLine}");

Console.WriteLine("ログを出力しました。");
}
}

ログフォルダの作成が目的なら、Directory.Existsで確認してから作成するより、Directory.CreateDirectoryを直接呼び出すほうが簡潔です。

5-4. ユーザー入力されたパスを検証する

ユーザーが入力したフォルダパスを確認する例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
Console.Write("フォルダパスを入力してください: ");
string input = Console.ReadLine();

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("パスが入力されていません。");
return;
}

string path = input.Trim().Trim('"');

if (Directory.Exists(path))
{
Console.WriteLine("有効なフォルダです。");
}
else
{
Console.WriteLine("フォルダが存在しない、またはアクセスできません。");
}
}
}

ユーザー入力では、未入力、前後の空白、引用符付きのパス、アクセス権限などを考慮する必要があります。

5-5. ネットワーク共有フォルダの存在を確認する

UNCパスでネットワーク共有フォルダを確認する例です。

C#
string networkPath = @"\\server01\share\reports";

if (Directory.Exists(networkPath))
{
Console.WriteLine("ネットワーク共有フォルダにアクセスできます。");
}
else
{
Console.WriteLine("共有フォルダが存在しない、またはアクセスできません。");
}

ネットワークパスでは、サーバー停止、ネットワーク切断、認証エラー、権限不足などによってfalseになることがあります。Directory.CreateDirectoryの公式ドキュメントでもUNCパスがサポートされることが説明されていますが、ネットワーク名が不明な場合などには例外が発生し得ます。Microsoft Learn

6. Directory.Existsと例外対策

6-1. Directory.Exists自体は例外を投げにくい

Directory.Existsは、存在確認中に問題が起きてもfalseを返す設計になっています。そのため、通常の存在確認だけであれば、try-catchを書かずに使われることも多いです。

C#
if (Directory.Exists(path))
{
Console.WriteLine("フォルダがあります。");
}

ただし、「例外を投げにくい」ことと「後続処理も安全である」ことは別です。

6-2. 存在チェック後の処理では例外対策が必要

次のコードは、存在チェック後にファイルを書き込んでいます。

C#
if (Directory.Exists(folderPath))
{
File.WriteAllText(filePath, "data");
}

しかし、Directory.Existstrueを返した後に、別のプロセスがフォルダを削除する可能性があります。また、書き込み権限がない可能性もあります。公式ドキュメントでも、存在確認後に別のプロセスが対象に処理を行う可能性があることに注意が促されています。Microsoft Learn

そのため、ファイル保存やフォルダ作成などの本処理では、try-catchを組み合わせるのが安全です。

6-3. Directory.CreateDirectoryで発生し得る例外

Directory.CreateDirectoryでは、さまざまな例外が発生する可能性があります。代表的なものは次のとおりです。

C#
try
{
Directory.CreateDirectory(path);
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("フォルダを作成する権限がありません。");
}
catch (IOException)
{
Console.WriteLine("入出力エラーが発生しました。");
}
catch (ArgumentException)
{
Console.WriteLine("パスの形式が正しくありません。");
}
catch (PathTooLongException)
{
Console.WriteLine("パスが長すぎます。");
}

Directory.CreateDirectoryの公式ドキュメントでは、UnauthorizedAccessExceptionIOExceptionArgumentExceptionArgumentNullExceptionPathTooLongExceptionDirectoryNotFoundExceptionNotSupportedExceptionなどが例外として示されています。Microsoft Learn

6-4. 権限エラーへの対処

権限エラーが起きる可能性があるフォルダでは、UnauthorizedAccessExceptionを個別に処理しましょう。

C#
try
{
string folderPath = @"C:\ProtectedFolder";
Directory.CreateDirectory(folderPath);

string filePath = Path.Combine(folderPath, "test.txt");
File.WriteAllText(filePath, "test");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("アクセス権限がありません。管理者権限やフォルダ権限を確認してください。");
}

特に、C:\Windows配下、Program Files配下、他ユーザーのフォルダ、ネットワーク共有などでは権限エラーに注意が必要です。

6-5. パス長や不正文字への対処

ユーザー入力や外部データからパスを受け取る場合、パス長や不正文字にも注意します。

C#
if (string.IsNullOrWhiteSpace(path))
{
Console.WriteLine("パスが空です。");
return;
}

char[] invalidChars = Path.GetInvalidPathChars();

if (path.IndexOfAny(invalidChars) >= 0)
{
Console.WriteLine("パスに使用できない文字が含まれています。");
return;
}

ただし、パスの妥当性チェックを自前で完全に行うのは簡単ではありません。最終的には実際のファイル操作やフォルダ操作をtry-catchで保護することが重要です。

6-6. try-catchを組み合わせた安全な実装例

フォルダを確認し、なければ作成し、ファイルを書き込む安全寄りの実装例です。

C#
using System;
using System.IO;

class Program
{
static void Main()
{
string folderPath = Path.Combine(AppContext.BaseDirectory, "output");
string filePath = Path.Combine(folderPath, "result.txt");

try
{
Directory.CreateDirectory(folderPath);

File.WriteAllText(filePath, "出力内容");

Console.WriteLine("ファイルを保存しました。");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("フォルダまたはファイルへのアクセス権限がありません。");
}
catch (PathTooLongException)
{
Console.WriteLine("パスが長すぎます。");
}
catch (IOException ex)
{
Console.WriteLine($"入出力エラーが発生しました: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"予期しないエラーが発生しました: {ex.Message}");
}
}
}

この例では、フォルダ作成にDirectory.CreateDirectoryを使い、実際の書き込み処理も含めて例外を処理しています。

7. Directory.Existsでよくある間違い

7-1. ファイルの存在確認にDirectory.Existsを使ってしまう

よくある間違いは、ファイルの存在確認にDirectory.Existsを使ってしまうことです。

C#
string filePath = @"C:\Work\sample.txt";

if (Directory.Exists(filePath))
{
Console.WriteLine("ファイルがあります。");
}

このコードは誤りです。ファイルの存在確認にはFile.Existsを使います。

C#
if (File.Exists(filePath))
{
Console.WriteLine("ファイルがあります。");
}

フォルダはDirectory.Exists、ファイルはFile.Existsと覚えましょう。

7-2. 相対パスの基準フォルダを誤解する

相対パスは、ソースコードの場所ではなく現在の作業ディレクトリを基準に解釈されます。

C#
string path = "Data";

Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine(Directory.Exists(path));

Visual Studioから実行した場合、コマンドラインから実行した場合、サービスとして実行した場合などで基準が変わることがあります。意図した場所を参照したい場合は、絶対パスやAppContext.BaseDirectoryを使いましょう。

7-3. 存在チェック後に必ず安全だと思い込む

Directory.Existstrueが返ったとしても、その直後の処理が必ず成功するとは限りません。

C#
if (Directory.Exists(folderPath))
{
File.WriteAllText(filePath, "data");
}

存在チェック後にフォルダが削除されたり、権限が変わったり、ディスク容量不足が起きたりする可能性があります。重要な処理では、存在チェックだけでなく例外処理も必要です。

7-4. 権限不足と存在しないフォルダを区別できない

Directory.Existsfalseを返した場合でも、理由は1つではありません。

C#
if (!Directory.Exists(path))
{
Console.WriteLine("フォルダが存在しません。");
}

このメッセージは不正確な場合があります。実際には、フォルダは存在しているがアクセス権限がないだけかもしれません。

C#
Console.WriteLine("フォルダが存在しない、またはアクセスできません。");

ユーザー向けのメッセージでは、このように幅を持たせた表現のほうが適切です。

7-5. パス文字列を直接連結してしまう

パスを直接連結すると、区切り文字のミスが起きやすくなります。

C#
string path = baseDir + "Data";

baseDirの末尾に\があるかどうかによって、意図しないパスになる可能性があります。

C#
string path = Path.Combine(baseDir, "Data");

パスを組み立てるときは、基本的にPath.Combineを使いましょう。

8. Directory.Existsと関連メソッドの使い分け

8-1. Directory.CreateDirectoryとの使い分け

Directory.Existsは存在確認に使います。Directory.CreateDirectoryはフォルダ作成に使います。

C#
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}

ただし、作成が目的なら次のように書けます。

C#
Directory.CreateDirectory(folderPath);

CreateDirectoryは既にフォルダが存在していても使用できるため、フォルダを必ず用意したい場合に便利です。

8-2. Directory.Deleteとの組み合わせ

フォルダが存在する場合だけ削除する例です。

C#
string folderPath = @"C:\Work\Temp";

if (Directory.Exists(folderPath))
{
Directory.Delete(folderPath, recursive: true);
Console.WriteLine("フォルダを削除しました。");
}

recursive: trueを指定すると、フォルダ内のファイルやサブフォルダも含めて削除します。削除処理は影響が大きいため、パスの確認と例外処理を慎重に行いましょう。

8-3. Directory.GetFilesとの組み合わせ

フォルダが存在する場合だけ、配下のファイル一覧を取得する例です。

C#
string folderPath = @"C:\Work\Data";

if (Directory.Exists(folderPath))
{
string[] files = Directory.GetFiles(folderPath);

foreach (string file in files)
{
Console.WriteLine(file);
}
}
else
{
Console.WriteLine("対象フォルダがありません。");
}

Directory.GetFilesは対象フォルダが存在しない場合やアクセスできない場合に例外が発生する可能性があるため、必要に応じてtry-catchを追加しましょう。

8-4. DirectoryInfo.Existsとの違い

DirectoryInfo.Existsは、DirectoryInfoクラスのインスタンスを使って存在確認を行うプロパティです。

C#
DirectoryInfo dir = new DirectoryInfo(@"C:\Work");

if (dir.Exists)
{
Console.WriteLine("フォルダが存在します。");
}

単純な存在確認だけならDirectory.Existsで十分です。一方、同じフォルダに対して作成日時、親フォルダ、ファイル一覧など複数の情報や操作を扱う場合は、DirectoryInfoを使うとコードをまとめやすくなります。DirectoryInfo.Existsも、ディレクトリが存在するかどうかを示すbool値を返します。Microsoft Learn

8-5. File.Existsとの使い分け

File.Existsはファイル用、Directory.Existsはフォルダ用です。

C#
string filePath = @"C:\Work\sample.txt";
string dirPath = @"C:\Work";

if (File.Exists(filePath))
{
Console.WriteLine("ファイルがあります。");
}

if (Directory.Exists(dirPath))
{
Console.WriteLine("フォルダがあります。");
}

パスがファイルなのかフォルダなのか分からない場合は、両方を確認することもできます。

C#
if (File.Exists(path))
{
Console.WriteLine("ファイルです。");
}
else if (Directory.Exists(path))
{
Console.WriteLine("フォルダです。");
}
else
{
Console.WriteLine("存在しない、またはアクセスできません。");
}

9. Directory.Existsのベストプラクティス

9-1. Path.Combineでパスを組み立てる

パスを作るときは、文字列連結ではなくPath.Combineを使いましょう。

C#
string folderPath = Path.Combine(AppContext.BaseDirectory, "data", "images");

この書き方にすると、区切り文字の入れ忘れや重複を避けやすくなります。

9-2. 存在チェック後の処理にも例外処理を入れる

Directory.Existsは事前確認として便利ですが、後続処理の成功を保証するものではありません。

C#
try
{
if (Directory.Exists(folderPath))
{
File.WriteAllText(filePath, "data");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

ファイル保存、削除、移動、一覧取得など、実際にファイルシステムへアクセスする処理では例外処理を入れましょう。

9-3. ユーザー入力値は事前に検証する

ユーザーが入力したパスを扱う場合は、空文字や引用符、前後の空白を考慮します。

C#
string input = Console.ReadLine();

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("パスを入力してください。");
return;
}

string path = input.Trim().Trim('"');

if (Directory.Exists(path))
{
Console.WriteLine("フォルダが存在します。");
}

入力値をそのまま使わず、最低限の整形と検証を行いましょう。

9-4. ネットワークパスはタイムアウトや接続状態を考慮する

ネットワーク共有フォルダでは、サーバー停止、VPN未接続、認証切れ、権限不足などが原因で判定に時間がかかったり、falseになったりすることがあります。

C#
string path = @"\\server01\share";

if (Directory.Exists(path))
{
Console.WriteLine("共有フォルダにアクセスできます。");
}
else
{
Console.WriteLine("共有フォルダにアクセスできません。");
}

ネットワークパスを頻繁にチェックする場合は、UIスレッドで直接実行しない、リトライ回数を制限する、失敗時のメッセージを分かりやすくする、といった配慮も必要です。

9-5. フォルダ作成目的ならCreateDirectoryを優先する

「フォルダがなければ作る」という目的なら、Directory.Existsで確認してから作るより、Directory.CreateDirectoryを直接呼ぶほうがシンプルです。

C#
Directory.CreateDirectory(folderPath);

この書き方なら、フォルダが既に存在する場合も問題なく処理できます。フォルダの存在によって処理を分けたい場合はDirectory.Exists、フォルダを確実に用意したい場合はDirectory.CreateDirectory、という使い分けがおすすめです。

10. Directory.Existsに関するよくある質問

10-1. Directory.Existsは例外を投げますか?

Directory.Existsは、存在確認中にエラーが発生した場合でも、多くのケースで例外ではなくfalseを返します。たとえば、パスが不正、長すぎる、ディスクに問題がある、権限がないといった場合にfalseになることがあります。Microsoft Learn

ただし、後続のDirectory.CreateDirectoryFile.WriteAllTextDirectory.GetFilesなどでは例外が発生する可能性があります。

10-2. 存在するのにfalseが返る原因は?

フォルダが存在するのにfalseが返る場合、次のような原因が考えられます。

C#
string path = @"C:\SomeFolder";

bool exists = Directory.Exists(path);

パスが間違っている、相対パスの基準を誤解している、アクセス権限がない、ネットワーク共有に接続できない、前後に余分な空白や引用符が入っている、などが代表的です。

C#
Console.WriteLine($"入力パス: [{path}]");
Console.WriteLine($"現在の作業ディレクトリ: {Directory.GetCurrentDirectory()}");

原因調査では、実際に判定しているパスと現在の作業ディレクトリを出力すると分かりやすくなります。

10-3. 相対パスはどこを基準に判定されますか?

相対パスは、現在の作業ディレクトリを基準に判定されます。

C#
string relativePath = "Data";

Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine(Directory.Exists(relativePath));

ソースコードのあるフォルダや実行ファイルのあるフォルダと常に一致するとは限りません。実行ファイル基準にしたい場合は、AppContext.BaseDirectoryPath.Combineを使うとよいでしょう。

C#
string path = Path.Combine(AppContext.BaseDirectory, "Data");

10-4. ファイルの存在確認にも使えますか?

使えません。Directory.Existsはフォルダの存在確認用です。ファイルの存在確認にはFile.Existsを使います。

C#
if (File.Exists(@"C:\Work\sample.txt"))
{
Console.WriteLine("ファイルが存在します。");
}

if (Directory.Exists(@"C:\Work"))
{
Console.WriteLine("フォルダが存在します。");
}

File.Existsは、指定したパスが既存のファイル名を含む場合にtrueを返し、ディレクトリを表す場合はfalseを返します。Microsoft Learn

10-5. フォルダがなければ自動作成できますか?

Directory.Exists自体にはフォルダを作成する機能はありません。フォルダを作成するにはDirectory.CreateDirectoryを使います。

C#
string folderPath = @"C:\Work\Output";

if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}

ただし、作成が目的なら次の1行で十分な場合が多いです。

C#
Directory.CreateDirectory(folderPath);

Directory.CreateDirectoryは、指定したパスにディレクトリやサブディレクトリが存在しない場合に作成し、既に存在する場合でもDirectoryInfoを返します。Microsoft Learn

まとめ

C#のDirectory.Existsは、指定したパスが既存のフォルダを指しているかどうかを確認するための基本的なメソッドです。戻り値はbool型で、フォルダが存在すればtrue、存在しなければfalseになります。

一方で、falseが返った場合でも、必ずしも「フォルダが存在しない」とは限りません。パスが不正、アクセス権限がない、ネットワーク共有に接続できない、ディスクに問題があるといったケースでもfalseになることがあります。そのため、Directory.Existsは事前確認として使い、実際のファイル保存、フォルダ作成、削除、一覧取得などの処理ではtry-catchによる例外対策を組み合わせることが重要です。

また、パスを組み立てるときは文字列連結ではなくPath.Combineを使うと、区切り文字のミスを避けやすくなります。フォルダがなければ作成したいだけなら、Directory.Existsで確認するよりDirectory.CreateDirectoryを直接呼び出すほうが簡潔な場合もあります。

Directory.ExistsDirectory.CreateDirectoryFile.ExistsDirectoryInfo.Existsを正しく使い分けることで、C#のファイル・フォルダ操作をより安全で分かりやすく実装できます。