Если вы используете 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 может использоваться в функции, если необходимо, или может быть удалено, если не нужно.