Merge pull request #485 from mtausig/master
authorMarek Safar <marek.safar@gmail.com>
Mon, 29 Oct 2012 16:49:43 +0000 (09:49 -0700)
committerMarek Safar <marek.safar@gmail.com>
Mon, 29 Oct 2012 16:49:43 +0000 (09:49 -0700)
Bugfix for DirectoryInfo.GetDirectories()

1  2 
mcs/class/corlib/System.IO/DirectoryInfo.cs

index 2848c5412cdfe653ad7e69755d4dbc5d0116f827,11dee2800578fb302cbc8a8e1558313584a04754..c6ec35c77ed2ac07ba747633cbaefc75d2966f9d
@@@ -273,27 -273,15 +273,15 @@@ namespace System.IO 
  #if !MOONLIGHT
                public DirectoryInfo[] GetDirectories (string searchPattern, SearchOption searchOption)
                {
-                       switch (searchOption) {
-                       case SearchOption.TopDirectoryOnly:
-                               return GetDirectories (searchPattern);
-                       case SearchOption.AllDirectories:
-                               Queue workq = new Queue(GetDirectories(searchPattern));
-                               Queue doneq = new Queue();
-                               while (workq.Count > 0)
-                                       {
-                                               DirectoryInfo cinfo = (DirectoryInfo) workq.Dequeue();
-                                               DirectoryInfo[] cinfoDirs = cinfo.GetDirectories(searchPattern);
-                                               foreach (DirectoryInfo i in cinfoDirs) workq.Enqueue(i);
-                                               doneq.Enqueue(cinfo);
-                                       }
-                               DirectoryInfo[] infos = new DirectoryInfo[doneq.Count];
-                               doneq.CopyTo(infos, 0);
-                               return infos;
-                       default:
-                               string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
-                               throw new ArgumentOutOfRangeException ("searchOption", msg);
+                   //NULL-check of searchPattern is done in Directory.GetDirectories
+                       string [] names = Directory.GetDirectories (FullPath, searchPattern, searchOption);
+                       //Convert the names to DirectoryInfo instances
+                       DirectoryInfo[] infos = new DirectoryInfo [names.Length];
+                       for (int i = 0; i<names.Length; ++i){
+                               string name = names[i];
+                               infos [i] = new DirectoryInfo (name);
                        }
+                       return infos;
                }       
  
                internal int GetFilesSubdirs (ArrayList l, string pattern)
                        return CreateSubdirectory (path);
                }
  
 -              [MonoNotSupported ("DirectorySecurity isn't implemented")]
                public DirectorySecurity GetAccessControl ()
                {
 -                      throw new UnauthorizedAccessException ();
 +                      return Directory.GetAccessControl (FullPath);
                }
  
 -              [MonoNotSupported ("DirectorySecurity isn't implemented")]
                public DirectorySecurity GetAccessControl (AccessControlSections includeSections)
                {
 -                      throw new UnauthorizedAccessException ();
 +                      return Directory.GetAccessControl (FullPath, includeSections);
                }
  
 -              [MonoLimitation ("DirectorySecurity isn't implemented")]
                public void SetAccessControl (DirectorySecurity directorySecurity)
                {
 -                      if (directorySecurity != null)
 -                              throw new ArgumentNullException ("directorySecurity");
 -                      throw new UnauthorizedAccessException ();
 +                      Directory.SetAccessControl (FullPath, directorySecurity);
                }
  #endif
  
                }
  
                public IEnumerable<DirectoryInfo> EnumerateDirectories (string searchPattern, SearchOption searchOption)
 +              {
 +                      if (searchPattern == null)
 +                              throw new ArgumentNullException ("searchPattern");
 +
 +                      return CreateEnumerateDirectoriesIterator (searchPattern, searchOption);
 +              }
 +
 +              IEnumerable<DirectoryInfo> CreateEnumerateDirectoriesIterator (string searchPattern, SearchOption searchOption)
                {
                        foreach (string name in Directory.EnumerateDirectories (FullPath, searchPattern, searchOption))
                                yield return new DirectoryInfo (name);
                }
  
                public IEnumerable<FileInfo> EnumerateFiles (string searchPattern, SearchOption searchOption)
 +              {
 +                      if (searchPattern == null)
 +                              throw new ArgumentNullException ("searchPattern");
 +
 +                      return CreateEnumerateFilesIterator (searchPattern, searchOption);
 +              }
 +
 +              IEnumerable<FileInfo> CreateEnumerateFilesIterator (string searchPattern, SearchOption searchOption)
                {
                        foreach (string name in Directory.EnumerateFiles (FullPath, searchPattern, searchOption))
                                yield return new FileInfo (name);