C# – 获取不包含隐藏的文件的列表

Directory.GetFiles()返回所有文件,甚至那些被标记为隐藏的文件。 有没有办法获得排除隐藏文件的文件列表?

这应该为你工作:

 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); } 
 // check whether a file is hidden bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden); 

使用.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有点懒。 但是,如果列举所有内容,这并不是很有用。

(让这里有查询一个,但更可收回)。

如果使用使用:

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

这只能find没有隐藏的文件,所以你可以使用:

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

这只是读取隐藏的文件

一行代码:

 FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => (file.Attributes & FileAttributes.Hidden) == 0).ToArray(); 

如果您正在使用SearchOption.TopDirectoryOnly – 那么它相对简单 – 如果您想使用SearchOption.AllDirectoriesrecursion列出所有文件,则会变得更加复杂。 如果你能GetFiles,然后过滤掉只读,但不幸的是,它不会与标记为隐藏的目录。 该文件夹下的文件也列出,但不像目录不隐藏。

您也可以使用GetDirectories,但是又不能使用SearchOption.AllDirectoriesrecursion地列出所有内容,因为它还列出了位于隐藏文件夹下的文件夹,但是这些文件夹没有启用隐藏属性。

至less对于龟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可以在函数中使用一个参数,或者如果不需要,可以移除。

我真的很喜欢传递一个函数参数给我想要的方法。 我有一个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; } 

然后,您可以使用列出的其他解决scheme编写一个采用单个FileInfo的IsHidden函数,如果是这样,则返回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); );