[Mono-dev] Directory.EnumerateFiles() does not enumerate read-only or hidden files

Uli Hertlein uli at xdt.com.au
Thu Mar 24 20:38:33 EDT 2011


Hi guys,

the subject sums it up - mono's (2.10.1 and git) System.IO.Directory.EnumerateFiles() does not show 
hidden or read-only files; MS .NET does show all files.

The reason for this is that read-only/hidden files do not have the FileAttributes.Normal bit set, 
which comes from the Win32 API (my emphasis):

FILE_ATTRIBUTE_NORMAL:
      A file that does not have other attributes set.
      *This attribute is valid only when used alone.*"

So:
normal    -> FileAttributes.Normal
ro        -> FileAttributes.ReadOnly
hidden    -> FileAttributes.Hidden
hidden/ro -> FileAttributes.Hidden | FileAttributes.ReadOnly

but:
directory/ro -> FileAttributes.Directory | FileAttributes.ReadOnly

(Which seems dumb (but that's beside the point): 'Normal' is the file type, like 'Directory' or 
'Device'; 'ReadOnly', 'Hidden', 'System', 'Encrypted' are additional attributes.)

The least intrusive way I can see to fix it is to add these flags (and probably Archived,System,etc 
as well) in the various EnumerateFiles/EnumerateFileSystemEntries overloads, like such:

<code>
const int NormalFileAttributes = FileAttributes.Normal | FileAttributes.ReadOnly | 
FileAttributes.Hidden; // ... posibly others

public static IEnumerable<string> EnumerateFiles (string path, string searchPattern)
{
      EnumerateCheck (path, searchPattern, SearchOption.TopDirectoryOnly);
      return EnumerateKind (path, searchPattern, SearchOption.TopDirectoryOnly, NormalFileAttributes);
}

public static IEnumerable<string> EnumerateFileSystemEntries (string path, string searchPattern)
{
      EnumerateCheck (path, searchPattern, SearchOption.TopDirectoryOnly);
      return EnumerateKind (path, searchPattern, SearchOption.TopDirectoryOnly, NormalFileAttributes 
| FileAttributes.Directory);
}
</code>

Thoughts?

Cheers,
/uli

-- 
Ulrich Hertlein
Research and Development   mailto:uli at xdt.com.au
XDT Pty Ltd                http://www.xdt.com.au



More information about the Mono-devel-list mailing list