2010-03-10 147 views

回答

83

这应该为你工作:

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); 
} 
+0

据我了解C#4.0应该使这种更快,更容易;-) – Dested 2010-03-10 15:55:40

+12

您可以在一行做到这一点,没有选择** var中的文件=新的DirectoryInfo(@“C:\ “).GetFiles()。其中​​(x =>(x.Attributes&FileAttributes.Hidden)== 0); ** – 2010-03-10 16:00:17

+5

或甚至只是使用目录类(通过8个字符减少@astanders解决方案) var files = Directory.GetFiles(@“c:\”)。其中(x =>(x.Attributes&FileAttributes.Hidden)== 0); – 2010-03-10 16:24:07

8

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

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

9
// check whether a file is hidden 
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden); 
+0

在linq不可用的情况下这很有用 – JDandChips 2012-11-30 10:47:21

+2

简单的解决方案可以很优雅 - 我喜欢当人们展示解决方案时不显示Linq – Kairan 2013-11-16 01:38:23

+0

或者等价地,File.GetAttributes(filePath).HasFlag(FileAttributes.Hidden)如果您愿意性能损失较小。 – Warty 2014-11-12 23:39:52

1

如果使用用途:

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);

这仅仅是阅读隐藏的f ILE

1

一行代码:

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

如果你使用SearchOption.TopDirectoryOnly - 那么它是比较简单的,但是 - 如果你要递归列出所有文件使用SearchOption.AllDirectories它变得更加复杂。如果你可以GetFiles,然后过滤掉只读,但不幸的是它不会用于标记为隐藏的目录。该文件夹下的文件也被列出,但与目录不同,它们不会被隐藏。

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

这是至少对于乌龟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

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

然后你可以使用所列的其他解决方案写一个是否隐藏函数,它接受一个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
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. 创建布尔返回true当字符串包含 '隐藏' ---- 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()));

+1

你想解释这 – Ctznkane525 2018-01-30 21:03:35

+0

此代码用于排除隐藏文件 – 2018-01-30 22:24:01

+0

如果你(Ctznkane525)有任何疑问 检查此代码并回复我这是正确与否 – 2018-01-30 22:28:24