From 285e89d96a0a7936417999cca337f2acb5a0690f Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Mon, 23 Nov 2009 07:22:20 +0000 Subject: [PATCH] Add new overloads svn path=/trunk/mcs/; revision=146707 --- mcs/class/corlib/System.IO/ChangeLog | 4 + mcs/class/corlib/System.IO/Directory.cs | 6 ++ mcs/class/corlib/System.IO/DirectoryInfo.cs | 97 +++++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/mcs/class/corlib/System.IO/ChangeLog b/mcs/class/corlib/System.IO/ChangeLog index 4074a5dd213..61daa28204e 100644 --- a/mcs/class/corlib/System.IO/ChangeLog +++ b/mcs/class/corlib/System.IO/ChangeLog @@ -1,7 +1,11 @@ 2009-11-23 Miguel de Icaza + * DirectoryInfo.cs: Added the new overloads. + * Directory.cs: Add EnumerateFiles and EnumerateFileSystemEntries overloads. Share code. + + Add new GetFileSystemEntries overload 2009-11-22 Miguel de Icaza diff --git a/mcs/class/corlib/System.IO/Directory.cs b/mcs/class/corlib/System.IO/Directory.cs index 5f3562babca..05c6b2b67ef 100644 --- a/mcs/class/corlib/System.IO/Directory.cs +++ b/mcs/class/corlib/System.IO/Directory.cs @@ -534,6 +534,12 @@ namespace System.IO } #if NET_4_0 + public static string[] GetFileSystemEntries (string path, string searchPattern, SearchOption searchOption) + { + // Take the simple way home: + return new System.Collections.Generic.List (EnumerateFileSystemEntries (path, searchPattern, searchOption)).ToArray (); + } + internal static System.Collections.Generic.IEnumerable EnumerateKind (string path, string searchPattern, SearchOption searchOption, FileAttributes kind) { if (searchPattern == null) diff --git a/mcs/class/corlib/System.IO/DirectoryInfo.cs b/mcs/class/corlib/System.IO/DirectoryInfo.cs index de8c8b2eefd..c488e9d280b 100644 --- a/mcs/class/corlib/System.IO/DirectoryInfo.cs +++ b/mcs/class/corlib/System.IO/DirectoryInfo.cs @@ -32,6 +32,7 @@ // using System.Collections; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Text; @@ -348,6 +349,102 @@ namespace System.IO { throw new ArgumentNullException ("directorySecurity"); throw new UnauthorizedAccessException (); } +#endif + +#if NET_4_0 + + public IEnumerable EnumerateDirectories () + { + return EnumerateDirectories ("*", SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateDirectories (string searchPattern) + { + return EnumerateDirectories (searchPattern, SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateDirectories (string searchPattern, SearchOption searchOption) + { + foreach (string name in Directory.EnumerateDirectories (FullPath, searchPattern, searchOption)) + yield return new DirectoryInfo (name); + } + + public IEnumerable EnumerateFiles () + { + return EnumerateFiles ("*", SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateFiles (string searchPattern) + { + return EnumerateFiles (searchPattern, SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateFiles (string searchPattern, SearchOption searchOption) + { + foreach (string name in Directory.EnumerateFiles (FullPath, searchPattern, searchOption)) + yield return new FileInfo (name); + } + + public IEnumerable EnumerateFileSystemInfos () + { + return EnumerateFileSystemInfos ("*", SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateFileSystemInfos (string searchPattern) + { + return EnumerateFileSystemInfos (searchPattern, SearchOption.TopDirectoryOnly); + } + + public IEnumerable EnumerateFileSystemInfos (string searchPattern, SearchOption searchOption) + { + if (searchPattern == null) + throw new ArgumentNullException ("searchPattern"); + if (searchOption != SearchOption.TopDirectoryOnly && searchOption != SearchOption.AllDirectories) + throw new ArgumentOutOfRangeException ("searchoption"); + + return EnumerateFileSystemInfos (FullPath, searchPattern, searchOption); + } + + static internal IEnumerable EnumerateFileSystemInfos (string full, string searchPattern, SearchOption searchOption) + { + string path_with_pattern = Path.Combine (full, searchPattern); + IntPtr handle; + MonoIOError error; + FileAttributes rattr; + bool subdirs = searchOption == SearchOption.AllDirectories; + + string s = MonoIO.FindFirst (full, path_with_pattern, out rattr, out error, out handle); + if (s == null) + yield break; + if (error != 0) + throw MonoIO.GetException (Path.GetDirectoryName (path_with_pattern), (MonoIOError) error); + + try { + if (((rattr & FileAttributes.ReparsePoint) == 0)){ + if ((rattr & FileAttributes.Directory) != 0) + yield return new DirectoryInfo (s); + else + yield return new FileInfo (s); + } + + while ((s = MonoIO.FindNext (handle, out rattr, out error)) != null){ + if ((rattr & FileAttributes.ReparsePoint) != 0) + continue; + if ((rattr & FileAttributes.Directory) != 0) + yield return new DirectoryInfo (s); + else + yield return new FileInfo (s); + + if (((rattr & FileAttributes.Directory) != 0) && subdirs) + foreach (FileSystemInfo child in EnumerateFileSystemInfos (s, searchPattern, searchOption)) + yield return child; + } + } finally { + MonoIO.FindClose (handle); + } + } + + #endif } } -- 2.25.1