6

DirectoryInfo.GetDirectories()特定のパスの下にあるすべてのサブディレクトリを見つけるために再帰的に使用しています。ただし、システム フォルダーを除外したいのですが、明確な方法がありません。FindFirstFile/FindNextFile では、属性がより明確になりました。

4

4 に答える 4

8

@rslite の言うとおりです。.NET はそのままではこのようなフィルタリングを提供しませんが、実装するのは難しくありません。

static IEnumerable<string> GetNonSystemDirs(string path)
{
    var dirs = from d in Directory.GetDirectories(path)
               let inf = new DirectoryInfo(d)
               where (inf.Attributes & FileAttributes.System) == 0
               select d;

    foreach (var dir in dirs)
    {
        yield return dir;
        foreach (var subDir in GetNonSystemDirs(dir))
        {
            yield return subDir;
        }
    }
}

MSDN リンク:

FileSystemInfo.Attributes プロパティ

FileAttributes 列挙

于 2008-09-19T09:51:44.160 に答える
3

これは、Linq と拡張メソッドによって物事が非常にクリーンで簡単になるシナリオの好例です。

public static DirectoryInfo[] GetNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.GetDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0)
        .ToArray();
}

.net v2 アプリケーションを構築している場合は、LinqBridgeを使用して、Linq からオブジェクトへのすべてのクールなメソッド (上記の Where() や ToArray() など) にアクセスできます。

編集

.net v4では、 GetDirectoriesの代わりにEnumerateDirectoriesを使用します。これにより、最初にメモリ内に配列を構築せずに結果を反復処理できます。

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.EnumerateDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
于 2008-09-19T10:07:48.770 に答える
0

究極のSweet Linqを使用

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
于 2014-03-10T01:53:22.793 に答える
0

おそらく、結果をループして、不要な属性を持つものを拒否する必要があります (Attributes プロパティを使用します)。

于 2008-09-19T09:37:33.273 に答える