-// \r
-// System.IO.DirectoryInfo.cs \r
-//\r
-// Author:\r
-// Miguel de Icaza, miguel@ximian.com\r
-// Jim Richardson, develop@wtfo-guru.com\r
-//\r
-// Copyright (C) 2002 Ximian, Inc.\r
-// Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved\r
-// \r
-\r
-using System;\r
-using System.Collections;\r
-using System.Private;\r
-\r
-namespace System.IO\r
-{\r
- public sealed class DirectoryInfo : FileSystemInfo\r
- {\r
- string path;\r
- \r
- public DirectoryInfo (string path)\r
- {\r
- if (path == null)\r
- throw new ArgumentNullException ();\r
- if (path.IndexOfAny (Path.InvalidPathChars) != -1)\r
- throw new ArgumentException ("Invalid characters in pathname");\r
-\r
- this.path = path;\r
- \r
- unsafe {\r
- stat s;\r
- int code;\r
- \r
- code = Wrapper.stat (path, &s);\r
- if (code != 0)\r
- throw new DirectoryNotFoundException ();\r
- }\r
- }\r
-\r
- public override bool Exists\r
- {\r
- get {\r
- unsafe {\r
- stat s;\r
- int code;\r
- \r
- code = Wrapper.stat (path, &s);\r
- return (code == 0);\r
- }\r
- }\r
- }\r
-\r
- public DirectoryInfo Parent {\r
- get {\r
- return new DirectoryInfo (path + Path.PathSeparator + "..");\r
- }\r
- }\r
-\r
- public override string Name\r
- {\r
- get {\r
- return path;\r
- }\r
- }\r
-\r
- public DirectoryInfo Root\r
- {\r
- get {\r
- return new DirectoryInfo ("" + Path.PathSeparator);\r
- }\r
- }\r
-\r
- public void Create ()\r
- {\r
- Wrapper.mkdir (path, 0777);\r
- }\r
-\r
- [MonoTODO]\r
- DirectoryInfo CreateSubdirectory (string path)\r
- {\r
- return null;\r
- }\r
-\r
- public override void Delete ()\r
- {\r
- if (Wrapper.rmdir (path) == Wrapper.ENOTEMPTY)\r
- throw new IOException ("Directory not empty");\r
- }\r
-\r
- [MonoTODO]\r
- public void Delete (bool recursive)\r
- {\r
- if (recursive == false)\r
- Delete ();\r
- }\r
-\r
- public DirectoryInfo[] GetDirectories ()\r
- {\r
- return GetDirectories ("*");\r
- }\r
-\r
- [MonoTODO("Add FileIOPermission Checks")]\r
- public DirectoryInfo[] GetDirectories (string searchPattern)\r
- {\r
- if (searchPattern == null)\r
- throw new ArgumentNullException ("searchPattern is null");\r
- \r
- ArrayList list = Directory.GetListing (path, searchPattern);\r
- if (list == null)\r
- throw new DirectoryNotFoundException ();\r
- \r
- ArrayList dir_list = new ArrayList ();\r
- \r
- foreach (string name in list){\r
- string full = path + Path.DirectorySeparatorChar + name;\r
-\r
- unsafe {\r
- stat s;\r
- \r
- if (Wrapper.stat (full, &s) != 0)\r
- continue;\r
-\r
- if ((s.st_mode & Wrapper.S_IFDIR) != 0)\r
- dir_list.Add (new DirectoryInfo (full));\r
- }\r
- }\r
-\r
- DirectoryInfo [] di_array = new DirectoryInfo [dir_list.Count];\r
- dir_list.CopyTo (di_array);\r
- \r
- return di_array;\r
- }\r
-\r
- public FileInfo[] GetFiles ()\r
- {\r
- return GetFiles ("*");\r
- }\r
-\r
- [MonoTODO("Add FileIOPermission Checks")]\r
- public FileInfo[] GetFiles (string searchPattern) {\r
- if (searchPattern == null)\r
- throw new ArgumentNullException ("searchPattern is null");\r
-\r
- ArrayList list = Directory.GetListing (path, searchPattern);\r
- if (list == null)\r
- throw new DirectoryNotFoundException ();\r
-\r
- ArrayList file_list = new ArrayList ();\r
- \r
- foreach (string name in list){\r
- string full = path + Path.DirectorySeparatorChar + name;\r
-\r
- unsafe {\r
- stat buf;\r
- \r
- if (Wrapper.stat (full, &buf) != 0)\r
- continue;\r
-\r
- if ((buf.st_mode & Wrapper.S_IFDIR) == 0)\r
- file_list.Add (new FileInfo (full));\r
- }\r
- }\r
- FileInfo [] fi_array = new FileInfo [file_list.Count];\r
- file_list.CopyTo (fi_array);\r
- \r
- return fi_array;\r
- }\r
-\r
- public static FileSystemInfo[] GetFileSystemInfos (string path)\r
- {\r
- return GetFileSystemInfos (path, "*");\r
- }\r
-\r
- public static FileSystemInfo[] GetFileSystemInfos (string path, string mask)\r
- {\r
- if (path == null)\r
- throw new ArgumentNullException ("path is null");\r
- if (mask == null)\r
- throw new ArgumentNullException ("mask is null");\r
- if (path.IndexOfAny (Path.InvalidPathChars) != -1)\r
- throw new ArgumentException ("Invalid characters in path");\r
-\r
- ArrayList list = Directory.GetListing (path, "*");\r
- if (list == null)\r
- throw new DirectoryNotFoundException ();\r
-\r
- FileSystemInfo [] fi = new FileSystemInfo [list.Count];\r
- int i = 0;\r
- foreach (string s in list){\r
- string name = path + Path.DirectorySeparatorChar + s;\r
-\r
- unsafe {\r
- stat buf;\r
- \r
- if (Wrapper.stat (name, &buf) != 0)\r
- continue;\r
- if ((buf.st_mode & Wrapper.S_IFDIR) == 0)\r
- fi [i++] = new FileInfo (name);\r
- else\r
- fi [i++] = new DirectoryInfo (name);\r
- }\r
- }\r
- \r
- return fi;\r
- }\r
-\r
- public void MoveTo (string dest)\r
- {\r
- if (dest == null)\r
- throw new ArgumentNullException ();\r
- if (dest == "")\r
- throw new ArgumentException ();\r
-\r
- if (Wrapper.rename (path, dest) != 0)\r
- throw new IOException ();\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
+
+ public DirectoryInfo[] GetDirectories (string pattern, SearchOption searchOption)
+ {
+ switch (searchOption) {
+ case SearchOption.TopDirectoryOnly:
+ return GetDirectories (pattern);
+ case SearchOption.AllDirectories:
+ 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);
+ }
+ }
+
+ 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: {
+ 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);
+ }
+ }
+
+ // 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
+ }
+}