2006-11-16 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / corlib / System.IO / DirectoryInfo.cs
index b8372743871c76db932c9d8dcd6193040edb293c..4bb1cf8e9e53dff77e114b11e2509f40fe1f7e1c 100644 (file)
@@ -203,28 +203,68 @@ namespace System.IO {
 #if NET_2_0
                // additional search methods
 
-               [MonoTODO ("AllDirectories isn't implemented")]
                public DirectoryInfo[] GetDirectories (string pattern, SearchOption searchOption)
                {
                        switch (searchOption) {
                        case SearchOption.TopDirectoryOnly:
                                return GetDirectories (pattern);
                        case SearchOption.AllDirectories:
-                               throw new NotImplementedException ();
+                               Queue workq = new Queue(GetDirectories(pattern));
+                               Queue doneq = new Queue();
+                               while (workq.Count > 0)
+                                       {
+                                               DirectoryInfo cinfo = (DirectoryInfo) workq.Dequeue();
+                                               DirectoryInfo[] cinfoDirs = cinfo.GetDirectories(pattern);
+                                               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);
                        }
                }       
 
-               [MonoTODO ("AllDirectories isn't implemented")]
+               internal int GetFilesSubdirs (ArrayList l, string pattern)
+               {
+                       int count;
+                       FileInfo [] thisdir = null;
+
+                       try {
+                               thisdir = GetFiles (pattern);
+                       } catch (System.UnauthorizedAccessException){
+                               return 0;
+                       }
+                       
+                       count = thisdir.Length;
+                       l.Add (thisdir);
+
+                       foreach (DirectoryInfo subdir in GetDirectories ()){
+                               count += subdir.GetFilesSubdirs (l, pattern);
+                       }
+                       return count;
+               }
+               
                public FileInfo[] GetFiles (string pattern, SearchOption searchOption)
                {
                        switch (searchOption) {
                        case SearchOption.TopDirectoryOnly:
                                return GetFiles (pattern);
-                       case SearchOption.AllDirectories:
-                               throw new NotImplementedException ();
+                       case SearchOption.AllDirectories: {
+                               ArrayList groups = new ArrayList ();
+                               int count = GetFilesSubdirs (groups, pattern);
+                               int current = 0;
+                               
+                               FileInfo [] all = new FileInfo [count];
+                               foreach (FileInfo [] p in groups){
+                                       p.CopyTo (all, current);
+                                       current += p.Length;
+                               }
+                               return all;
+                       }
                        default:
                                string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
                                throw new ArgumentOutOfRangeException ("searchOption", msg);