指定されたパスがフォルダかを調べるにはどうしたら良いのか。
ディレクトリであるかを調べるDirectory.Existsメソッドを使うと "C:\" などのルートディレクトリでもtrueを返す。
これを良しとしないのなら、File.GetAttributesメソッドで属性を取得して比較することになる。
bool ret = File.GetAttributes(path).Equals(FileAttributes.Directory);これなら、指定したパスがルートディレクトリの場合、falseを返す。一応これで、期待通りの答えが返るワケだが... しかし、指定したパスが存在しない場合、例外が発生するのでこれを回避するために結局
Directory.Existsメソッドを使い、指定したパスの存在チェックを行うとなると、なんか「え~~(-д-)」といった感じ。下記のようにメソッドにして
try catchで処理しても、パスが存在しないと余計に時間が掛る結果となった。public static bool IsFolder(string path)
{
try
{
return File.GetAttributes(path).Equals(FileAttributes.Directory);
}
catch (Exception ex)
{
if (ex.GetType() == typeof(FileNotFoundException))
{
return false;
}
throw ex;
}
}
結局、時と場合に応じてこの二つの方法を使い分けるべきか。
もし、
Directory.Existsを使うなら、こんな感じになるかな?public enum FileType
{
File = 0,
Directory //(Folder)
}
//Sample - 1
public static bool IsFileType1(string path, FileType filetype)
{
Func<string, bool>[] isType = new Func<string, bool>[]{
File.Exists,
Directory.Exists
};
return isType[(int)filetype](path);
}
//Sample - 2
public static bool IsFileType2(string path, FileType filetype)
{
Func<string, bool> isType = filetype == FileType.File ?
(Func<string, bool>)File.Exists : Directory.Exists;
return isType(path);
}
Usage
string path = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), @"test"); Console.WriteLine(IsFileType1(path, FileType.Directory));





0 Comments:
コメントを投稿