指定されたパスがフォルダかを調べる - C#

指定されたパスがフォルダかを調べるにはどうしたら良いのか。



ディレクトリであるかを調べる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:

Recent Posts