代码之家  ›  专栏  ›  技术社区  ›  James Cadd

C#-获取文件列表,排除隐藏的文件

  •  60
  • James Cadd  · 技术社区  · 16 年前

    Directory.GetFiles()

    8 回复  |  直到 14 年前
        1
  •  105
  •   BetaKeja Austin Salonen    10 年前

    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);
    }
    
        2
  •  14
  •   Amar Palsapure    14 年前
    // check whether a file is hidden
    bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
    
        3
  •  8
  •   Jérôme Laban    16 年前

    使用.NET 4.0和Directory.EnumerateDirectory,可以使用以下构造:

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

    (let在这里是为了使查询更具可读性)。

        4
  •  2
  •   jesus gilbert    12 年前

    如果使用:

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

    这只是为了读取隐藏的文件

        5
  •  2
  •   Ghasem    11 年前

    单行代码:

    FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => 
                (file.Attributes & FileAttributes.Hidden) == 0).ToArray();
    
        6
  •  1
  •   TarmoPikaro    10 年前

    如果您只使用SearchOption.TopDirectoryOnly,那么它相对简单,但是如果您想使用SearchOption.AllDirectories递归地列出所有文件,它会变得更复杂。如果您可以获取文件,然后过滤出只读,但不幸的是,它将无法与目录标记为隐藏。文件夹下的文件也会列出,但它们不像目录那样隐藏。

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

        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可以在函数中用作参数;如果不需要,sopt可以删除。

        7
  •  1
  •   Jonathan    9 年前

    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); );
    
        8
  •  0
  •   Ujjwal Kashyap    8 年前
    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. 当字符串包含“Hidden”时,创建返回true的bool---- 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()));