C # - получить список файлов, исключая те, которые скрыты - PullRequest
61 голосов
/ 10 марта 2010

Directory.GetFiles() возвращает все файлы, даже те, которые помечены как скрытые. Есть ли способ получить список файлов, который исключает скрытые файлы?

Ответы [ 8 ]

96 голосов
/ 10 марта 2010

Это должно работать для вас:

DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();

var filtered = files.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden));

foreach (var f in filtered)
{
    Debug.WriteLine(f);
}
11 голосов
/ 24 марта 2011
// check whether a file is hidden
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
8 голосов
/ 10 марта 2010

Используя .NET 4.0 и Directory.EnumerateDirectories, вы можете использовать эту конструкцию:

var hiddenFilesQuery = from file in Directory.EnumerateDirectories(@"c:\temp")
                       let info = new FileInfo(file)
                       where (info.Attributes & FileAttributes.Hidden) == 0
                       select file;

Это в основном то же самое, что и другой ответ, за исключением того, что Directory.EnumerateDirectories немного ленивее. Это не очень полезно, если вы все перечисляете.

(Позвольте здесь иметь запрос, но более понятный).

1 голос
/ 08 ноября 2016

Мне на самом деле скорее нравится передавать параметр функции в метод, который делает то, что я хочу. У меня есть метод SearchDirectory, который служит основой для большинства вызовов, которые я использую:

private void SearchDirectory(DirectoryInfo startDirectory, 
                             string pattern, 
                             Action<FileInfo> act)
{
    foreach (var file in startDirectory.GetFiles(pattern))
        act(file);

    foreach (var directory in startDirectory.GetDirectories())
        SearchDirectory(directory, pattern, act);
}

private List<FileInfo> SearchDirectory(DirectoryInfo startDirectory, 
                                       string pattern, 
                                       Func<FileInfo, bool> isWanted)
{
    var lst = new List<FileInfo>();
    SearchDirectory(startDirectory, 
                    pattern, 
                    (fi) => { if (isWanted(fi)) lst.Add(fi); });
    return lst;
}

Затем вы можете использовать другие перечисленные решения для написания функции IsHidden, которая принимает один FileInfo и возвращает true, если так:

private bool IsHiddenDirectory(DirectoryInfo d) {
    if (d == null) return false;
    if (d.Attributes.HasFlag(FileAttributes.Hidden))) return true;
    if (d.Parent == null) return false;
    return IsHiddenDirectory(d.Parent);
}

private bool IsHidden(FileInfo fi) {
    if ((fi.Attributes & FileAttributes.Hidden) != 0) return true;
    // If you're worried about parent directories hidden:
    return IsHiddenDirectory(fi.Directory);
    // otherwise:
    return false;
}

Тогда я могу довольно легко вызвать его в другом методе:

var files = SearchDirectory(new DirectoryInfo("C:\temp\"),
                            "*.xml",
                            (fi) => { return !IsHidden(fi); );
1 голос
/ 27 мая 2016

Если вы используете SearchOption.TopDirectoryOnly - тогда это относительно просто, однако - становится намного сложнее, если вы хотите рекурсивно перечислить все файлы с помощью SearchOption.AllDirectories. Если вы можете GetFiles, а затем отфильтровать только для чтения, но, к сожалению, он не будет работать с каталогами, помеченными как скрытые. Файлы в этих папках также отображаются в списке, но они не скрыты в отличие от каталога.

Вы также можете использовать GetDirectories, но опять же - вы не можете перечислить все рекурсивно, используя SearchOption.AllDirectories, поскольку в нем также перечислены папки, которые находятся в скрытой папке, но в этих папках не включен скрытый атрибут.

Это относится, по крайней мере, к скрытой папке Tortoise svn .svn. Он содержит много папок, которые не скрыты, но .svn скрыт. Наконец я написал функцию, которая выглядит так:

    SearchOption sopt = SearchOption.AllDirectories;
    List<String> listFiles = new List<string>();
    List<DirectoryInfo> dirs2scan = new List<DirectoryInfo>();

    dirs2scan.Add(new DirectoryInfo(fromPath) );

    for( ; dirs2scan.Count != 0; )
    {
        int scanIndex = dirs2scan.Count - 1;        // Try to preserve somehow alphabetic order which GetFiles returns 
                                                    // by scanning though last directory.
        FileInfo[] filesInfo = dirs2scan[scanIndex].GetFiles(pattern, SearchOption.TopDirectoryOnly);

        foreach (FileInfo fi in filesInfo)
        {
            if (bNoHidden && fi.Attributes.HasFlag(FileAttributes.Hidden))
                continue;

            listFiles.Add(fi.FullName);
        }

        if( sopt != SearchOption.AllDirectories )
            break;

        foreach (DirectoryInfo dir in dirs2scan[scanIndex].GetDirectories("*", SearchOption.TopDirectoryOnly))
        {
            if (bNoHidden && dir.Attributes.HasFlag(FileAttributes.Hidden))
                continue;

            dirs2scan.Add(dir);
        }
        dirs2scan.RemoveAt(scanIndex);
    }

sopt может использоваться в функции, если необходимо, или может быть удалено, если не нужно.

1 голос
/ 29 апреля 2015

Код одной строки:

FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => 
            (file.Attributes & FileAttributes.Hidden) == 0).ToArray();
1 голос
/ 10 августа 2014

при использовании:

var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == 0);

это только найти скрытый файл, поэтому вы можете использовать:

var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden);

только для чтения скрытого файла

0 голосов
/ 30 января 2018
static bool IsHidden(string p)
{
 return p.Contains("Hidden");
}

DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();

var filtered = files.Where(f => !IsHidden(File.GetAttributes(f).ToString()));

foreach (var f in filtered)
{
 Debug.WriteLine(f);
}

Шаги:

  1. Создать bool, который возвращает true, когда строка содержит 'Hidden' ---- static bool IsHidden(string p){return p.Contains("Hidden");}

  2. получить информацию о каталоге ---- DirectoryInfo directory = new DirectoryInfo(@"C:\temp");

  3. получить массив информации о файле из каталога ---- FileInfo[] files = directory.GetFiles();

  4. получить информацию о файлеАтрибуты и преобразовать в строку из массива информации о файле и проверить, содержит ли он «Скрытый» или нет ---- var filtered = files.Where(f=>!IsHidden(File.GetAttributes(f).ToString()));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...