C#のDirectoryInfoとは?フォルダ操作の基本・使い方・FileInfoとの違いを初心者向けに解説
はじめに
C#でフォルダを操作したいときに、まず覚えておきたいのがDirectoryInfoです。DirectoryInfoを使うと、フォルダを単なる文字列のパスとして扱うのではなく、情報を持ったオブジェクトとして扱えます。
たとえば、フォルダの存在確認、作成日時の取得、サブフォルダやファイルの一覧取得、フォルダの作成・削除・移動など、ファイルシステム操作の多くを分かりやすく書けます。
C#のDirectoryInfoは、初心者がフォルダ操作を理解する入口としても非常に重要です。
この記事では、DirectoryInfoの基本から、FileInfoやDirectoryとの違い、実践的な使い方まで、順番にわかりやすく解説します。
1. C#のDirectoryInfoとは?フォルダ操作をオブジェクトとして扱うクラス
DirectoryInfoは、C#でフォルダを表すクラスです。
フォルダのパスを指定してインスタンスを作ることで、そのフォルダに対する情報取得や操作ができるようになります。
文字列のパスを直接扱う方法でもフォルダ操作はできますが、DirectoryInfoを使うと「このフォルダそのもの」を表すオブジェクトとして扱えるため、コードの見通しがよくなります。
1-1. DirectoryInfoの役割とできること
DirectoryInfoでできる主なことは次のとおりです。
フォルダの存在確認
フォルダ名、フルパス、親フォルダの取得
作成日時、更新日時、アクセス日時の取得
フォルダの作成、削除、移動
ファイルやサブフォルダの一覧取得
検索条件を指定したファイル取得
つまり、DirectoryInfoは「フォルダの情報を見る」「フォルダを操作する」の両方に使えるクラスです。
1-2. DirectoryInfoが属する名前空間と基本構文
DirectoryInfoはSystem.IO名前空間に含まれています。
使うときは、先頭でusing System.IO;を追加します。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Sample");
基本構文はとてもシンプルです。new DirectoryInfo(パス)でフォルダを表すオブジェクトを作成します。
1-3. DirectoryInfoを使う場面と初心者がつまずきやすいポイント
DirectoryInfoは、次のような場面で役立ちます。
ログ保存用フォルダを自動作成したいとき
フォルダ内のファイル一覧を取得したいとき
更新日時を見て処理対象を絞りたいとき
サブフォルダを含めてまとめて検索したいとき
初心者がつまずきやすいのは、パスの指定方法です。
特に、相対パスと絶対パスの違い、バックスラッシュの扱い、存在しないフォルダへのアクセスには注意が必要です。
また、DirectoryInfoを作っただけではフォルダは作成されません。実際にフォルダを作るにはCreateメソッドを呼び出す必要があります。
2. DirectoryInfoの基本的な使い方
DirectoryInfoは、まずインスタンスを作成し、その後に各種プロパティやメソッドを使います。
基本を押さえるだけで、多くのフォルダ操作がスムーズになります。
2-1. DirectoryInfoオブジェクトを作成する方法
DirectoryInfoの作成は、パスを渡すだけです。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
ここで指定したパスは、まだフォルダが存在しなくても問題ありません。
オブジェクトとして保持されるだけなので、存在確認や作成に利用できます。
2-2. フォルダの存在を確認する方法
存在確認にはExistsプロパティを使います。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (dir.Exists)
{
Console.WriteLine("フォルダは存在します。");
}
else
{
Console.WriteLine("フォルダは存在しません。");
}
Existsは、対象フォルダが実際にあるかどうかを簡単に判定できる便利なプロパティです。
2-3. フォルダ名・フルパス・親フォルダを取得する方法
DirectoryInfoでは、フォルダに関する基本情報を簡単に取得できます。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
Console.WriteLine(dir.Name); // Report
Console.WriteLine(dir.FullName); // C:\Work\Report
Console.WriteLine(dir.Parent); // C:\Work
よく使うプロパティは次のとおりです。
Name:フォルダ名FullName:フルパスParent:親フォルダRoot:ルートフォルダ
ParentやRootは、階層構造をたどるときに便利です。
2-4. 作成日時・更新日時などの情報を取得する方法
フォルダの作成日時や更新日時も取得できます。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
Console.WriteLine(dir.CreationTime);
Console.WriteLine(dir.LastWriteTime);
Console.WriteLine(dir.LastAccessTime);
取得できる主な日時は次の3つです。
CreationTime:作成日時LastWriteTime:最終更新日時LastAccessTime:最終アクセス日時
ファイル処理では、更新日時を見て「新しいフォルダだけ処理する」といった判定に使うことがあります。
3. DirectoryInfoでフォルダを作成・削除・移動する方法
DirectoryInfoは、情報を取得するだけでなく、フォルダそのものを操作できます。
基本操作として、作成、削除、移動を覚えておくと便利です。
3-1. Createメソッドでフォルダを作成する
フォルダを作成するにはCreateメソッドを使います。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (!dir.Exists)
{
dir.Create();
}
Createを呼ぶと、指定したフォルダが実際に作成されます。
途中の親フォルダが存在しない場合は失敗することがあるため、必要に応じて親フォルダも事前に確認しておくと安心です。
3-2. Deleteメソッドでフォルダを削除する
フォルダの削除にはDeleteを使います。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (dir.Exists)
{
dir.Delete();
}
空ではないフォルダを削除したい場合は、Delete(true)を使います。
C#dir.Delete(true);
ただし、trueを指定するとフォルダ内のファイルやサブフォルダもまとめて削除されるため、注意が必要です。
3-3. MoveToメソッドでフォルダを移動・名前変更する
MoveToメソッドを使うと、フォルダを別の場所に移動したり、名前を変更したりできます。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
dir.MoveTo(@"C:\Archive\Report");
移動先のパスを変えれば、そのままリネームにもなります。
C#dir.MoveTo(@"C:\Work\Report_2024");
フォルダの場所だけでなく、名前を変えたいときにもMoveToは便利です。
3-4. 削除や移動で発生しやすい例外と注意点
フォルダ操作では例外が発生しやすいので、注意が必要です。
よくある原因は次のとおりです。
対象フォルダが存在しない
アクセス権がない
フォルダが使用中でロックされている
移動先のパスが不正
空でないフォルダを通常のDeleteで削除しようとした
実際の業務コードでは、try-catchで例外処理を書くのが基本です。
フォルダ操作は成功する前提にせず、失敗したときの処理も用意しておくと安全です。
4. DirectoryInfoでファイルやサブフォルダを取得する方法
DirectoryInfoの大きな魅力は、フォルダの中身を扱いやすいことです。
ファイル一覧やサブフォルダ一覧を取得して、必要な情報だけを絞り込めます。
4-1. GetFilesメソッドでフォルダ内のファイルを取得する
フォルダ内のファイルを取得するにはGetFilesを使います。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
Console.WriteLine(file.Name);
}
GetFilesは、対象フォルダ内のファイルをFileInfoの配列として返します。
ファイル名だけでなく、サイズや更新日時なども扱えるようになります。
4-2. GetDirectoriesメソッドでサブフォルダを取得する
サブフォルダを取得するにはGetDirectoriesを使います。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
DirectoryInfo[] directories = dir.GetDirectories();
foreach (DirectoryInfo subDir in directories)
{
Console.WriteLine(subDir.Name);
}
サブフォルダを一覧化したいときに便利です。
バックアップ先や分類済みフォルダを調べるときにも役立ちます。
4-3. EnumerateFiles・EnumerateDirectoriesとの違い
GetFilesとEnumerateFilesは似ていますが、動きが少し違います。
GetFilesは、最初にすべての対象をまとめて取得します。EnumerateFilesは、必要になったものから順に取得します。
大量のファイルがある場合は、EnumerateFilesのほうが効率的なことがあります。
一覧を一気に使うならGetFiles、順番に処理するならEnumerateFilesというイメージで覚えるとよいでしょう。
C#foreach (FileInfo file in dir.EnumerateFiles())
{
Console.WriteLine(file.Name);
}
4-4. 拡張子や検索パターンを指定して取得する方法
GetFilesには検索パターンを指定できます。
C#FileInfo[] txtFiles = dir.GetFiles("*.txt");
この例では、.txt拡張子のファイルだけを取得します。
ワイルドカードを使えば、条件をかなり柔軟に指定できます。
C#FileInfo[] csvFiles = dir.GetFiles("data_*.csv");
ファイル名のルールが決まっている場合、検索パターンを使うと処理がシンプルになります。
4-5. サブフォルダを含めて再帰的に検索する方法
サブフォルダの中まで含めて検索したい場合は、SearchOption.AllDirectoriesを指定します。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
FileInfo[] files = dir.GetFiles("*.txt", SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
Console.WriteLine(file.FullName);
}
これで、配下のすべての階層から対象ファイルを探せます。
深いフォルダ構造を持つプロジェクトや、ログ保存先の検索などで重宝します。
5. DirectoryInfoとFileInfoの違い
DirectoryInfoとFileInfoは、どちらもSystem.IOに含まれるクラスです。
ただし、扱う対象が異なります。
5-1. DirectoryInfoはフォルダ、FileInfoはファイルを扱うクラス
一番大きな違いは、対象がフォルダかファイルかです。
DirectoryInfo:フォルダを扱うFileInfo:ファイルを扱う
たとえば、DirectoryInfoは「Reportフォルダ」を表し、FileInfoは「report.txt」のような1つのファイルを表します。
5-2. 取得できる情報や使えるメソッドの違い
DirectoryInfoでは、フォルダの作成、削除、移動、サブフォルダ一覧の取得などができます。FileInfoでは、ファイルのコピー、削除、移動、サイズ取得などができます。
それぞれ得意分野が違うため、目的に応じて使い分ける必要があります。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
FileInfo file = new FileInfo(@"C:\Work\Report\sample.txt");
5-3. DirectoryInfoとFileInfoを組み合わせて使う例
DirectoryInfoでフォルダ内のファイル一覧を取得し、それぞれのFileInfoを使って処理するのはよくある使い方です。
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
foreach (FileInfo file in dir.GetFiles())
{
Console.WriteLine($"{file.Name} - {file.Length} bytes");
}
このように、フォルダ全体をDirectoryInfoで扱い、個々のファイルをFileInfoで扱う流れが自然です。
5-4. どちらを使うべきか判断するポイント
フォルダを中心に処理したいならDirectoryInfo、ファイルを中心に処理したいならFileInfoを使うのが基本です。
フォルダ配下の一覧取得やフォルダ作成が主目的ならDirectoryInfo、ファイルの詳細情報確認やファイル移動が主目的ならFileInfoが向いています。
6. DirectoryInfoとDirectoryクラスの違い
C#では、フォルダ操作にDirectoryInfoだけでなくDirectoryクラスも使えます。
この2つは似ていますが、使い方の考え方が違います。
6-1. DirectoryInfoはインスタンスを作って操作する
DirectoryInfoは、フォルダごとにオブジェクトを作って扱います。
C#DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
このオブジェクトに対して、存在確認や一覧取得、作成、削除などを行います。
同じフォルダに対して何度も操作する場面では、オブジェクトとして保持できる点が便利です。
6-2. Directoryクラスは静的メソッドで操作する
Directoryは静的クラスとして使います。
インスタンスを作らず、メソッドを直接呼び出します。
C#using System.IO;
if (Directory.Exists(@"C:\Work\Report"))
{
Console.WriteLine("存在します");
}
単発の操作なら、Directoryのほうが手軽に書けます。
6-3. 繰り返し操作・複数処理ではDirectoryInfoが便利
DirectoryInfoは、フォルダの情報をオブジェクトとして保持できるため、複数回参照するときに便利です。
たとえば、存在確認をしたあとに、作成日時や一覧取得を続けて行うような場面では、DirectoryInfoのほうが自然に書けます。
6-4. 単発のフォルダ操作ではDirectoryクラスも選択肢
「存在確認だけしたい」「その場でフォルダを作成したい」といった単発処理なら、Directoryクラスでも十分です。
どちらが正解というより、用途に応じて選ぶのが大切です。
7. DirectoryInfoを使った実践サンプルコード
ここでは、実際の開発で使いやすいサンプルを紹介します。
基本を組み合わせるだけで、実務でも使えるコードになります。
7-1. 指定フォルダ内のファイル一覧を表示する
C#using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (!dir.Exists)
{
Console.WriteLine("フォルダが存在しません。");
return;
}
foreach (FileInfo file in dir.GetFiles())
{
Console.WriteLine(file.Name);
}
}
}
フォルダの存在確認をしたうえで、ファイル一覧を表示する基本形です。
7-2. 特定の拡張子だけを取得する
C#using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
foreach (FileInfo file in dir.GetFiles("*.csv"))
{
Console.WriteLine(file.FullName);
}
}
}
拡張子で絞り込むことで、必要なファイルだけを効率よく取得できます。
7-3. フォルダがなければ作成する
C#using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (!dir.Exists)
{
dir.Create();
}
ログ出力先や一時保存先を用意するときに、よく使う書き方です。
7-4. フォルダ内のファイル数や容量を集計する
C#using System;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
if (!dir.Exists)
{
Console.WriteLine("フォルダが存在しません。");
return;
}
FileInfo[] files = dir.GetFiles();
int fileCount = files.Length;
long totalSize = files.Sum(f => f.Length);
Console.WriteLine($"ファイル数: {fileCount}");
Console.WriteLine($"合計サイズ: {totalSize} bytes");
}
}
このように、FileInfoのLengthを使うと、ファイルサイズの合計も簡単に出せます。
7-5. サブフォルダを含めてファイルを検索する
C#using System;
using System.IO;
class Program
{
static void Main()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
foreach (FileInfo file in dir.GetFiles("*.txt", SearchOption.AllDirectories))
{
Console.WriteLine(file.FullName);
}
}
}
配下のフォルダも含めて検索したいときに便利です。
ログ、文書、設定ファイルの収集などで活用できます。
8. DirectoryInfoを使うときの注意点
DirectoryInfoは便利ですが、ファイルシステムを扱う以上、注意点もあります。
事前に知っておくと、エラーを減らせます。
8-1. 相対パスと絶対パスの違いに注意する
DirectoryInfoには相対パスも指定できますが、実行環境によって解釈が変わることがあります。
初心者は、できるだけ絶対パスを使うと分かりやすく安全です。
C#DirectoryInfo dir = new DirectoryInfo(@"C:\Work\Report");
相対パスを使う場合は、現在の実行フォルダを意識する必要があります。
8-2. アクセス権限による例外に注意する
フォルダが存在していても、アクセス権がなければ操作できません。
特に、システムフォルダや他ユーザーの領域を扱うときは注意が必要です。
ファイル操作の失敗原因がパスではなく権限であることも多いため、例外メッセージを確認する習慣をつけておくと安心です。
8-3. フォルダが存在しない場合の処理を書く
GetFilesやGetDirectoriesを呼ぶ前に、フォルダが存在するか確認するのが基本です。
存在しないフォルダに対して処理を進めると、例外が起こる可能性があります。
C#if (!dir.Exists)
{
dir.Create();
}
このように、必要なら先に作成してから処理を続けると安定します。
8-4. 大量ファイルを扱う場合はEnumerate系メソッドを検討する
大量のファイルを一度に取得すると、メモリや処理時間の負担が大きくなることがあります。
そのような場合は、GetFilesよりEnumerateFilesを検討するとよいでしょう。
C#foreach (FileInfo file in dir.EnumerateFiles())
{
Console.WriteLine(file.Name);
}
ファイル数が多い現場では、この違いが効いてきます。
8-5. パス結合にはPath.Combineを使う
パスを文字列連結でつなぐと、\\の重複や区切り記号の違いでミスが起きやすくなります。
そんなときはPath.Combineを使うと安全です。
C#using System.IO;
string path = Path.Combine(@"C:\Work", "Report", "sample.txt");
DirectoryInfoと組み合わせるときも、Path.Combineを使う習慣をつけると、読みやすく保守しやすいコードになります。
9. DirectoryInfoに関するよくある質問
9-1. DirectoryInfoでファイルを作成できる?
DirectoryInfoはフォルダ用のクラスなので、ファイルの作成はできません。
ファイルを作る場合はFileクラスやFileStreamを使います。DirectoryInfoはあくまでフォルダを扱うためのクラスです。
9-2. DirectoryInfoで空フォルダかどうか判定できる?
はい、できます。GetFiles()とGetDirectories()の結果を見れば、フォルダ内にファイルやサブフォルダがあるか判定できます。
C#bool isEmpty = dir.GetFiles().Length == 0 && dir.GetDirectories().Length == 0;
9-3. DirectoryInfoで隠しフォルダや読み取り専用フォルダを判定できる?
はい、Attributesプロパティで判定できます。
C#bool isHidden = dir.Attributes.HasFlag(FileAttributes.Hidden);
bool isReadOnly = dir.Attributes.HasFlag(FileAttributes.ReadOnly);
フォルダ属性を確認したいときに便利です。
9-4. DirectoryInfoとPathクラスは何が違う?
DirectoryInfoはフォルダそのものを扱うクラスです。
一方でPathクラスは、パス文字列を操作するためのクラスです。
たとえば、Path.Combine、Path.GetFileName、Path.GetExtensionのように、文字列としてのパスを加工するときはPathを使います。
フォルダの情報や操作をしたいならDirectoryInfo、パス文字列を整えたいならPathと覚えると分かりやすいです。
9-5. DirectoryInfoは初心者でも使うべき?
はい、フォルダ操作を学ぶなら、初心者でも積極的に使う価値があります。DirectoryInfoは、フォルダをオブジェクトとして理解できるので、ファイルシステムの考え方を身につけやすいです。
最初はExists、Create、GetFiles、GetDirectoriesだけでも十分実用的です。
まとめ
DirectoryInfoは、C#でフォルダをオブジェクトとして扱える便利なクラスです。
存在確認、作成日時取得、フォルダ作成・削除・移動、ファイル一覧取得、サブフォルダ検索など、フォルダ操作の基本を幅広くカバーできます。
FileInfoはファイル用、Directoryは静的に手早く使う方法、Pathはパス文字列の操作と、それぞれ役割が異なります。
まずはDirectoryInfoでフォルダ操作の基本を押さえ、そのあとでFileInfoやDirectory、Pathを組み合わせて使えるようになると、C#でのファイルシステム操作がぐっと楽になります。

