DirectoryInfo.GetDirectories () и атрибуты - PullRequest
6 голосов
/ 19 сентября 2008

Я использую DirectoryInfo.GetDirectories() рекурсивно, чтобы найти все подкаталоги по заданному пути. Однако я хочу исключить системные папки, и для этого нет четкого пути. В FindFirstFile / FindNextFile все прояснилось с атрибутами.

Ответы [ 4 ]

8 голосов
/ 19 сентября 2008

@ 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

3 голосов
/ 19 сентября 2008

Это отличный пример сценария, в котором методы 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 to objects (таким как Where () и ToArray () выше).

Редактировать

В .net v4 вы бы использовали EnumerateDirectories вместо GetDirectories , что позволяет вам перебирать результаты без предварительного построения массива в памяти.

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory,
    string searchPattern,
    SearchOption searchOption)
{
    return directory.EnumerateDirectories(searchPattern, searchOption)
        .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
0 голосов
/ 10 марта 2014

Использование Ultimate Sweet Linq

 IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
0 голосов
/ 19 сентября 2008

Вам, вероятно, придется циклически просмотреть результаты и отклонить те, у которых атрибуты не нужны (используйте свойство Attributes).

...