フォルダ操作
ここではフォルダ(ディレクトリ)を操作する方法を説明します。
ファイルの操作はファイル操作を参照してください。
フォルダの操作にはDirectory
クラスを使用します。
DirectoryクラスはSystem.IO
名前空間に存在するので、コード先頭のusingディレクティブに以下を追加してください。
using System;
//↓なければこれを追加
using System.IO;
なお、フォルダとディレクトリ(Directory)はここでは同じものと考えて構いません。
フォルダというのは他のプログラムからも使用されることがあるので、フォルダ操作は比較的エラーの起きやすい処理です。
何らかの理由で読み書きに失敗した場合は実行時エラー(例外)になります。
以下のサンプルコードはエラー処理は省いています。
エラーに適切に対処するには例外を参照してください。
フォルダの存在確認
指定のパスにフォルダが存在するかをチェックするには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
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」で属性を設定します)