C # - Get a list of files except hidden

Directory.GetFiles() returns all files, even those marked as hidden. Is there a way to get a list of files that excludes hidden files?

+53
c # file
Mar 10
source share
7 answers

This should work for you:

 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); } 
+83
Mar 10
source share
 // check whether a file is hidden bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden); 
+9
Mar 24 '11 at 16:21
source share

Using .NET 4.0 and Directory.EnumerateDirectories, you can use this construct:

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

This is basically the same as another answer except Directory.EnumerateDirectories is a bit more lazy. This is not very useful if you are listing everything.

(The query a is given here, but more readeable).

+8
Mar 10 '10 at 18:00
source share

if use is used:

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

this does not find the hidden file, so you can use:

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

this is just reading a hidden file

+1
Aug 10 '14 at 15:28
source share

One line code:

 FileInfo[] tmpFiles = tempDir.GetFiles().Where(file => (file.Attributes & FileAttributes.Hidden) == 0).ToArray(); 
+1
Apr 29 '15 at 8:28
source share

If you use SearchOption.TopDirectoryOnly - then it is relatively simple, however - it becomes much more complicated if you want to recursively list all files using SearchOption.AllDirectories. If you can getFiles, then filter out read-only, but unfortunately it will not work with directories marked as hidden. Files under these folders also appear in the list, but they are not hidden unlike the directory.

You can also use GetDirectories, but again - you cannot list everything recursively using SearchOption.AllDirectories, since it also lists folders that are in a hidden folder, but these folders do not have a hidden attribute.

This is at least for the Tortoise svn.svn hidden folder. It contains many folders that are not hidden, but .svn is hidden. Finally, I wrote a function that looks like this:

  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 can be used as a parameter in a function, if necessary, or removed if not required.

0
May 27 '16 at 5:31
source share

I really prefer to pass the parameter of the function to a method that does what I want. I have a SearchDirectory method that forms the basis for most of the calls that I use:

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

Then you can use the other solutions listed to write the IsHidden function, which takes one FileInfo and returns true if it is:

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

Then I can call it another way quite easily:

 var files = SearchDirectory(new DirectoryInfo("C:\temp\"), "*.xml", (fi) => { return !IsHidden(fi); ); 
0
Nov 08 '16 at 13:09
source share



All Articles