指定されたパスがフォルダかを調べるにはどうしたら良いのか。
ディレクトリであるかを調べる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:
コメントを投稿