Hi guys,

the subject sums it up - mono's (2.10.1 and git) System.IO.Directory.EnumerateFiles() does 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: 'Normal' is the file type, like 'Directory' or 'Device'; 'ReadOnly', 'Hidden', 'System', 'Encrypted' are additional attributes. But that's beside the point.)

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>
public static IEnumerable<string> EnumerateFiles (string path, string 
searchPattern)
{
    EnumerateCheck (path, searchPattern, SearchOption.TopDirectoryOnly);
return EnumerateKind (path, searchPattern, SearchOption.TopDirectoryOnly, FileAttributes.Normal | FileAttributes.ReadOnly | FileAttributes.Hidden);
}

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

Thoughts?

Cheers,
/uli

--
Ulrich Hertlein
Research and Development   mailto:[email protected]
XDT Pty Ltd                http://www.xdt.com.au
//
// Create some files in the current directory:
// $ touch normal readonly .hidden
// $ chmod -w readonly
//
// The following program should show all of them.
// $ dmcs Program.cs
// $ mono ./Program.exe
//

namespace DirectoryEnumerateFilesTest
{
    using System;
    using System.IO;

    internal static class Program
    {
        internal static void Main(string[] args)
        {
            try
            {
                string path = ".";
                string pattern = "*.*";
                foreach (string item in Directory.EnumerateFiles(path, pattern))
                {
                    Console.WriteLine(item);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}
_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to