私が見るすべての例は、ファイルのみを使用してサブディレクトリ内のファイルを再帰的に取得するためのもののようです。私がやろうとしているのは、「xxx」という名前の特定のサブディレクトリのフォルダーを検索し、そのパスを変数に保存して、他のことに使用できるようにすることです。
すべてのディレクトリをループして名前で比較しなくても、これは可能ですか?
私が見るすべての例は、ファイルのみを使用してサブディレクトリ内のファイルを再帰的に取得するためのもののようです。私がやろうとしているのは、「xxx」という名前の特定のサブディレクトリのフォルダーを検索し、そのパスを変数に保存して、他のことに使用できるようにすることです。
すべてのディレクトリをループして名前で比較しなくても、これは可能ですか?
良い
Directory.GetDirectories(root);
サブディレクトリの配列を返します。
次に、Linq を使用して、関心のあるものを見つけることができます。
IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));
これはコードのループではありませんが、それでもループです。したがって、究極の答えは、「いいえ、ループせずに「test」フォルダーを見つけることはできません」です。
Linq に追加.SingleOrDefault()
することもできますが、それは、「テスト」フォルダーが見つからない場合に何をしたいかによって異なります。
GetDirectories
SearchOption を含めるように呼び出しを変更するとSearchOption.AllDirectories
、再帰も実行されます。このバージョンでは検索がサポートされています。検索文字列を指定する必要がありますが、.NET Framework では大文字と小文字が区別されます。"*"
検索語として渡すすべてのサブディレクトリを返すには。
この場合、ディレクトリ ツリーに「test」という名前のフォルダが複数あると、呼び出しによって複数の項目が返される可能性があります。
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)
これは、指定された名前で見つかったすべてのフォルダーを含む文字列配列を返します。最上位のディレクトリのみをチェックするように最後のパラメータを変更し、ルートを変更してどこから開始するかを調整できます。
まず、「いいえ、すべてのディレクトリをループして名前で比較しないと不可能です」。
あなたの本当の質問は、「すべてのディレクトリをループして名前で比較することを処理する既存のAPIはありますか?」だと思います。
はいあります。それは呼ばれていDirectory.Exists()
ます:
var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
savedPath = xxxPath;
はい、利用可能な唯一の解決策 (サードパーティのライブラリを除く) は、名前の比較によるディレクトリの再帰的検索であると思います。
.Net 用の API を提供する Windows Search も使用できます。より詳細な情報は次のとおりです: Windows Search 4.0 for Developers
UnauthorizedAccessException を考慮しながら、2 つのフィルターを使用してフォルダーを検索するためのスニペットを次に示します。1 つのフィルターのみを使用するようにリファクタリングできます。
public static string FindGitPath(string firstFilter, string secondFilter, string initialPath)
{
string gitPath = string.Empty;
foreach (var i in Directory.GetDirectories(initialPath)) {
try {
foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) {
foreach (var s in Directory.GetDirectories(f)) {
if (s == Path.Combine(f,secondFilter)) {
gitPath = f;
break;
}
}
}
} catch (UnauthorizedAccessException) {
Console.WriteLine("Path is not accessible: {0}", i);
}
}
return gitPath;
}
使用例:
Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\"));