* support-test-*.cs: Rename from test-*-p2.cs.
[mono.git] / mcs / class / corlib / System.IO / DirectoryInfo.cs
index 512f096283d156c23cef2fd2f1ca1343d9fea0dd..b8372743871c76db932c9d8dcd6193040edb293c 100644 (file)
-//------------------------------------------------------------------------------\r
-// \r
-// System.IO.DirectoryInfo.cs \r
-//\r
-// Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved\r
-// \r
-// Author:         Jim Richardson, develop@wtfo-guru.com\r
-// Created:        Monday, August 13, 2001 \r
-//\r
-//------------------------------------------------------------------------------\r
-\r
-using System;\r
-using System.Diagnostics;\r
-\r
-namespace System.IO\r
-{\r
-       /// <summary>\r
-       /// \r
-       /// </summary>\r
-       public sealed class DirectoryInfo : FileSystemInfo\r
-       {\r
-\r
-               public DirectoryInfo(string path)\r
-               {\r
-                       CheckArgument.Path(path, false);\r
-                       //LAMESPEC: Does not throw directory not found exception\r
-                       //          Does not throw security exception in constructor\r
-                       OriginalPath = path;    \r
-               }\r
-\r
-               public override bool Exists\r
-               {\r
-                       get\r
-                       {\r
-                               bool bRetCode;\r
-                               \r
-                               try\r
-                               {\r
-                                       Refresh();\r
-                                       bRetCode = ((Attributes & FileAttributes.Directory) != 0);\r
-                               }\r
-                               catch(ArgumentException ex)                             \r
-                               {\r
-                                       Debug.WriteLine(ex); // eliminates not used warning\r
-                                       bRetCode = false;\r
-                               }\r
-                               return bRetCode;\r
-                       }\r
-               }\r
-\r
-               [MonoTODO]\r
-               public override string Name\r
-               {\r
-                       get\r
-                       {       //TODO: Implement this as per the documenation\r
-                               return FullPath;\r
-                       }\r
-               }\r
-\r
-               [MonoTODO]\r
-               public DirectoryInfo Root\r
-               {\r
-                       get\r
-                       {       //TODO: Implement\r
-                               return null;\r
-                       }\r
-               }\r
-\r
-               [MonoTODO]\r
-               public void Create()\r
-               {\r
-                       //TODO: Implement\r
-               }\r
-\r
-               [MonoTODO]\r
-               DirectoryInfo CreateSubdirectory(string path)\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-\r
-               public override void Delete()\r
-               {\r
-                       Directory.Delete(FullPath);\r
-               }\r
-\r
-               public void Delete(bool bRecurse)\r
-               {\r
-                       Directory.Delete(FullPath, bRecurse);\r
-               }\r
-\r
-               /// <summary>\r
-               /// Returns an array of DirectoryInfos for subdirectories\r
-               /// </summary>\r
-               [MonoTODO]\r
-               public DirectoryInfo[] GetDirectories()\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-               /// <summary>\r
-               /// Returns an array of DirectoryInfos\r
-               /// matching the filter specified by mask\r
-               /// </summary>\r
-               [MonoTODO]\r
-               public static DirectoryInfo[] GetDirectories(string mask)\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-               /// <summary>\r
-               /// Returns an array of FileInfo for subdirectories\r
-               /// </summary>\r
-               public FileInfo[] GetFiles()\r
-               {\r
-                       return null;\r
-               }\r
-               /// <summary>\r
-               /// Returns an array of FileInfo\r
-               /// matching the filter specified by mask\r
-               /// </summary>\r
-               [MonoTODO]\r
-               public static FileInfo[] GetFiles(string mask)\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-               /// <summary>\r
-               /// Returns an array of FileSystemInfo for subdirectories\r
-               /// </summary>\r
-               [MonoTODO]\r
-               public FileSystemInfo[] GetFileSystemInfos()\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-               /// <summary>\r
-               /// Returns an array of FileSystemInfo\r
-               /// matching the filter specified by mask\r
-               /// </summary>\r
-               [MonoTODO]\r
-               public static FileSystemInfo[] GetFileSystemInfos(string mask)\r
-               {\r
-                       return null;    //TODO: Implement\r
-               }\r
-\r
-               public void MoveTo(string destDirName)\r
-               {\r
-                       Directory.Move(FullName, destDirName);\r
-               }\r
-\r
-               public override string ToString()\r
-               {\r
-                       return FullName;\r
-               }\r
-       }\r
-}\r
+// 
+// System.IO.DirectoryInfo.cs 
+//
+// Authors:
+//   Miguel de Icaza, miguel@ximian.com
+//   Jim Richardson, develop@wtfo-guru.com
+//   Dan Lewis, dihlewis@yahoo.co.uk
+//   Sebastien Pouliot  <sebastien@ximian.com>
+//
+// Copyright (C) 2002 Ximian, Inc.
+// Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Collections;
+using System.Runtime.InteropServices;
+using System.Text;
+#if NET_2_0
+using System.Security.AccessControl;
+#endif
+
+namespace System.IO {
+       
+       [Serializable]
+#if NET_2_0
+       [ComVisible (true)]
+#endif
+       public sealed class DirectoryInfo : FileSystemInfo {
+
+               private string current;
+               private string parent;
+       
+               public DirectoryInfo (string path)
+               {
+                       CheckPath (path);
+
+                       FullPath = Path.GetFullPath (path);
+                       OriginalPath = path;
+
+                       int len = FullPath.Length - 1;
+                       if ((len > 1) && (FullPath [len] == Path.DirectorySeparatorChar))
+                               len--;
+                       int last = FullPath.LastIndexOf (Path.DirectorySeparatorChar, len);
+                       if ((last == -1) || ((last == 0) && (len == 0))) {
+                               current = FullPath;
+                               parent = null;
+                       } else {
+                               current = FullPath.Substring (last + 1, len - last);
+                               if (last == 0 && !Environment.IsRunningOnWindows)
+                                       parent = Path.DirectorySeparatorStr;
+                               else
+                                       parent = FullPath.Substring (0, last);
+                               // adjust for drives, i.e. a special case for windows
+                               if (Environment.IsRunningOnWindows) {
+                                       if ((parent.Length == 2) && (parent [1] == ':') && Char.IsLetter (parent [0]))
+                                               parent += Path.DirectorySeparatorChar;
+                               }
+                       }
+               }
+
+               // properties
+
+               public override bool Exists {
+                       get {
+                               Refresh (false);
+
+                               if (stat.Attributes == MonoIO.InvalidFileAttributes)
+                                       return false;
+
+                               if ((stat.Attributes & FileAttributes.Directory) == 0)
+                                       return false;
+
+                               return true;
+                       }
+               }
+
+               public override string Name {
+                       get { return current; }
+               }
+
+               public DirectoryInfo Parent {
+                       get {
+                               if ((parent == null) || (parent.Length == 0))
+                                       return null;
+                               return new DirectoryInfo (parent);
+                       }
+               }
+
+               public DirectoryInfo Root {
+                       get {
+                               string root = Path.GetPathRoot (FullPath);
+                               if (root == null)
+                                       return null;
+
+                               return new DirectoryInfo (root);
+                       }
+               }
+
+               // creational methods
+
+               public void Create () {
+                       Directory.CreateDirectory (FullPath);
+               }
+
+               public DirectoryInfo CreateSubdirectory (string name) {
+                       CheckPath (name);
+                       
+                       string path = Path.Combine (FullPath, name);
+                       Directory.CreateDirectory (path);
+
+                       return new DirectoryInfo (path);
+               }
+
+               // directory listing methods
+
+               public FileInfo [] GetFiles () {
+                       return GetFiles ("*");
+               }
+
+               public FileInfo [] GetFiles (string pattern)
+               {
+                       string [] names = Directory.GetFiles (FullPath, pattern);
+
+                       FileInfo[] infos = new FileInfo [names.Length];
+                       int i = 0;
+                       foreach (string name in names)
+                               infos [i++] = new FileInfo (name);
+
+                       return infos;
+               }
+
+               public DirectoryInfo [] GetDirectories () {
+                       return GetDirectories ("*");
+               }
+
+               public DirectoryInfo [] GetDirectories (string pattern)
+               {
+                       string [] names = Directory.GetDirectories (FullPath, pattern);
+
+                       DirectoryInfo[] infos = new DirectoryInfo [names.Length];
+                       int i = 0;
+                       foreach (string name in names)
+                               infos [i++] = new DirectoryInfo (name);
+
+                       return infos;
+               }
+
+               public FileSystemInfo [] GetFileSystemInfos () {
+                       return GetFileSystemInfos ("*");
+               }
+
+               public FileSystemInfo [] GetFileSystemInfos (string pattern)
+               {
+                       string[] dirs = Directory.GetDirectories (FullPath, pattern);
+                       string[] files = Directory.GetFiles (FullPath, pattern);
+
+                       FileSystemInfo[] infos = new FileSystemInfo [dirs.Length + files.Length];
+                       int i = 0;
+                       foreach (string dir in dirs)
+                               infos [i++] = new DirectoryInfo (dir);
+                       foreach (string file in files)
+                               infos [i++] = new FileInfo (file);
+
+                       return infos;
+               }
+
+               // directory management methods
+
+               public override void Delete () {
+                       Delete (false);
+               }
+
+               public void Delete (bool recurse) {
+                       Directory.Delete (FullPath, recurse);
+               }
+
+               public void MoveTo (string dest) {
+                       Directory.Move (FullPath, Path.GetFullPath (dest));
+               }
+
+               public override string ToString () {
+                       return OriginalPath;
+               }
+#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 ();
+                       default:
+                               string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
+                               throw new ArgumentOutOfRangeException ("searchOption", msg);
+                       }
+               }       
+
+               [MonoTODO ("AllDirectories isn't implemented")]
+               public FileInfo[] GetFiles (string pattern, SearchOption searchOption)
+               {
+                       switch (searchOption) {
+                       case SearchOption.TopDirectoryOnly:
+                               return GetFiles (pattern);
+                       case SearchOption.AllDirectories:
+                               throw new NotImplementedException ();
+                       default:
+                               string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
+                               throw new ArgumentOutOfRangeException ("searchOption", msg);
+                       }
+               }
+
+               // access control methods
+
+               [MonoTODO ("DirectorySecurity isn't implemented")]
+               public void Create (DirectorySecurity directorySecurity)
+               {
+                       if (directorySecurity != null)
+                               throw new NotImplementedException ();
+                       Create ();
+               }
+
+               [MonoTODO ("DirectorySecurity isn't implemented")]
+               public DirectoryInfo CreateSubdirectory (string name, DirectorySecurity directorySecurity)
+               {
+                       if (directorySecurity != null)
+                               throw new NotImplementedException ();
+                       return CreateSubdirectory (name);
+               }
+
+               [MonoTODO ("DirectorySecurity isn't implemented")]
+               public DirectorySecurity GetAccessControl ()
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO ("DirectorySecurity isn't implemented")]
+               public DirectorySecurity GetAccessControl (AccessControlSections includeSections)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO ("DirectorySecurity isn't implemented")]
+               public void SetAccessControl (DirectorySecurity directorySecurity)
+               {
+                       if (directorySecurity != null)
+                               throw new ArgumentNullException ("directorySecurity");
+                       throw new NotImplementedException ();
+               }
+#endif
+       }
+}