フォルダ操作

ここではフォルダ(ディレクトリ)を操作する方法を説明します。
ファイルの操作はファイル操作を参照してください。

フォルダの操作にはDirectoryクラスを使用します。
Directoryクラスは「System.IO」名前空間に存在するので、コード先頭のusingディレクティブに以下を追加してください。


using System;

//↓なければこれを追加
using System.IO;

フォルダというのは他のプログラムからも使用されることがあるので、フォルダ操作は比較的エラーの起きやすい処理です。
何らかの理由でフォルダ操作に失敗した場合はエラー(例外)が発生します。

以下のサンプルコードはエラー処理は省いています。
エラーに適切に対処するには例外を参照してください。

フォルダの存在確認

指定のパスにフォルダが存在するかをチェックするにはDirectory.Existsメソッドを使用します。


string path = @"C:\test";
if (Directory.Exists(path))
    Console.WriteLine("{0}は存在する", path);
else
    Console.WriteLine("{0}は存在しない", path);

//DirectoryクラスはSystem.IO内にある
//System.IO.Directory

ファイル操作に「System.IO.File」クラスを使用したのと同様に、フォルダの操作には「System.IO.Directory」クラスを使用します。
Directory(ディレクトリ)というのはフォルダと同義と考えて構いません。

Directory.Existsメソッドは引数に指定したパスが存在する場合は真を、存在しなければ偽を返します。
パスは相対パスまたは絶対パスで指定します。

パスの最後の「\」(フォルダ階層の区切り記号)はあってもなくてもどちらでも構いません。
(「C:\test」でも「C:\test\」でも良い)

「string path = @"C:\test";」の「@」記号はエスケープシーケンスの抑制記号です。
(詳しくはエスケープシーケンスの抑制(逐語的文字列)を参照)

File.ExistsとDirectory.Exists

File.ExistsとDirectory.Existsはどちらも指定パスの存在を確認するメソッドですが、ファイルの存在確認にDirectory.Existsを使用することはできません。
(必ず偽が返ってきます)
逆も同様です。
「File.Exists(@"C:\test\")」のようにパスの最後を\記号にしてもフォルダの存在確認はできません。

フォルダの作成

フォルダを作成するにはDirectory.CreateDirectoryメソッドを使用します。


string path = @"C:\test";
if (Directory.Exists(path))
{
    Console.WriteLine("{0}は存在します", path);
    Console.WriteLine("処理を中止します。");
    Console.ReadLine();
    return;
}

//「C:\test」を作成
Directory.CreateDirectory(path);

Directory.CreateDirectoryメソッドは指定のフォルダが存在する場合はエラー(例外)が発生します。
指定のフォルダの親フォルダへのアクセス権がない場合も例外が発生します。

フォルダ階層を一気に作成

Directory.CreateDirectoryメソッドは指定のフォルダの親フォルダが存在しない場合は階層を自動的に作成します。


string path = @"C:\test";
if (Directory.Exists(path))
{
    Console.WriteLine("{0}は存在します", path);
    Console.WriteLine("処理を中止します。");
    Console.ReadLine();
    return;
}

string path2 = @"\sub1\sub2";

//「C:\test\sub1\sub2」を作成
Directory.CreateDirectory(path + path2);

フォルダの移動(名前の変更)

フォルダを移動するにはDirectory.Moveメソッドを使用します。


string pathSource = @"C:\test";
string pathDest = @"C:\test_move";

if (!Directory.Exists(pathSource))
{
    Console.WriteLine("{0}は存在しません。", pathSource);
    Console.ReadLine();
    return;
}
if (Directory.Exists(pathDest))
{
    Console.WriteLine("{0}はすでに存在します。", pathDest);
    Console.ReadLine();
    return;
}

//「C:\test」を「C:\test_move」に移動
//リネームと同義
Directory.Move(pathSource, pathDest);

移動元のフォルダが存在しない場合、または移動先のフォルダが存在する場合はエラー(例外)が発生します。

File.Moveメソッドは別ドライブへのファイルコピーが可能ですが、Directory.Moveメソッドは同じドライブ内への移動しかできません。
これは移動というよりは名前の変更と同等の処理です。
別ドライブへ移動させようとすると例外が発生します。

Directory.CreateDirectoryメソッドのように、移動先に存在しない親フォルダを指定して移動することはできません。
また親フォルダを子フォルダ内に移動するなどの矛盾する移動はできません。
(「C:test」は「C:\test\sub」に移動できない)

フォルダの削除

フォルダを削除するにはDirectory.Deleteメソッドを使用します。


string path = @"C:\test";

if (!Directory.Exists(path))
{
    Console.WriteLine("{0}は存在しません。", path);
    Console.ReadLine();
    return;
}

//「C:\test」の削除
Directory.Delete(path);

Directory.Deleteメソッドは指定のフォルダ内にファイルやフォルダ(サブフォルダ)が存在すると削除に失敗します。
(例外が発生する)
中のファイルを無視して削除するには第二引数にtrueを指定します。


string path = @"C:\test";

//「C:\test」の削除
//フォルダ内のファイル、サブフォルダも削除
Directory.Delete(path, true);

この方法でも、フォルダの中身に読み取り専用のファイルが含まれているとエラーになります。
これに対処するにはフォルダ内のファイルの読み取り専用属性を削除してからフォルダを削除する必要があります。
具体的な方法についてはファイルとフォルダの列挙 - フォルダの削除で説明します。

フォルダのコピー

C#にはフォルダをコピーするメソッドは用意されていません。
(Directory.Copyなどはない)
フォルダをコピーする場合は、目的のフォルダを作成してからフォルダの中身をFile.Copyメソッドなどでコピーする必要があります。

具体的な方法についてはファイルとフォルダの列挙 - フォルダのコピーで説明します。

フォルダの属性

フォルダにもファイルと同様に属性の設定があります。
詳しくはファイルの属性を参照してください。
(フォルダの場合も「File.GetAttribute/SetAttribute」で属性を設定します)