2 // System.IO.DirectoryInfo.cs
5 // Miguel de Icaza, miguel@ximian.com
6 // Jim Richardson, develop@wtfo-guru.com
7 // Dan Lewis, dihlewis@yahoo.co.uk
8 // Sebastien Pouliot <sebastien@ximian.com>
10 // Copyright (C) 2002 Ximian, Inc.
11 // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved
12 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Collections;
35 using System.Runtime.InteropServices;
36 using System.Runtime.Serialization;
39 using System.Security.AccessControl;
46 public sealed class DirectoryInfo : FileSystemInfo {
48 private string current;
49 private string parent;
51 public DirectoryInfo (string path) : this (path, false)
55 internal DirectoryInfo (string path, bool simpleOriginalPath)
59 FullPath = Path.GetFullPath (path);
60 if (simpleOriginalPath)
61 OriginalPath = Path.GetFileName (path);
68 private DirectoryInfo (SerializationInfo info, StreamingContext context)
69 : base (info, context)
76 int len = FullPath.Length - 1;
77 if ((len > 1) && (FullPath [len] == Path.DirectorySeparatorChar))
79 int last = FullPath.LastIndexOf (Path.DirectorySeparatorChar, len);
80 if ((last == -1) || ((last == 0) && (len == 0))) {
84 current = FullPath.Substring (last + 1, len - last);
85 if (last == 0 && !Environment.IsRunningOnWindows)
86 parent = Path.DirectorySeparatorStr;
88 parent = FullPath.Substring (0, last);
89 // adjust for drives, i.e. a special case for windows
90 if (Environment.IsRunningOnWindows) {
91 if ((parent.Length == 2) && (parent [1] == ':') && Char.IsLetter (parent [0]))
92 parent += Path.DirectorySeparatorChar;
99 public override bool Exists {
103 if (stat.Attributes == MonoIO.InvalidFileAttributes)
106 if ((stat.Attributes & FileAttributes.Directory) == 0)
113 public override string Name {
114 get { return current; }
117 public DirectoryInfo Parent {
119 if ((parent == null) || (parent.Length == 0))
121 return new DirectoryInfo (parent);
125 public DirectoryInfo Root {
127 string root = Path.GetPathRoot (FullPath);
131 return new DirectoryInfo (root);
135 // creational methods
137 public void Create ()
139 Directory.CreateDirectory (FullPath);
142 public DirectoryInfo CreateSubdirectory (string path)
146 path = Path.Combine (FullPath, path);
147 Directory.CreateDirectory (path);
148 return new DirectoryInfo (path);
151 // directory listing methods
153 public FileInfo [] GetFiles ()
155 return GetFiles ("*");
158 public FileInfo [] GetFiles (string searchPattern)
160 if (searchPattern == null)
161 throw new ArgumentNullException ("searchPattern");
163 string [] names = Directory.GetFiles (FullPath, searchPattern);
165 FileInfo[] infos = new FileInfo [names.Length];
167 foreach (string name in names)
168 infos [i++] = new FileInfo (name);
173 public DirectoryInfo [] GetDirectories ()
175 return GetDirectories ("*");
178 public DirectoryInfo [] GetDirectories (string searchPattern)
180 if (searchPattern == null)
181 throw new ArgumentNullException ("searchPattern");
183 string [] names = Directory.GetDirectories (FullPath, searchPattern);
185 DirectoryInfo[] infos = new DirectoryInfo [names.Length];
187 foreach (string name in names)
188 infos [i++] = new DirectoryInfo (name);
193 public FileSystemInfo [] GetFileSystemInfos ()
195 return GetFileSystemInfos ("*");
198 public FileSystemInfo [] GetFileSystemInfos (string searchPattern)
200 if (searchPattern == null)
201 throw new ArgumentNullException ("searchPattern");
203 if (!Directory.Exists (FullPath))
204 throw new IOException ("Invalid directory");
205 string [] dirs = Directory.GetDirectories (FullPath, searchPattern);
206 string [] files = Directory.GetFiles (FullPath, searchPattern);
208 FileSystemInfo[] infos = new FileSystemInfo [dirs.Length + files.Length];
210 foreach (string dir in dirs)
211 infos [i++] = new DirectoryInfo (dir);
212 foreach (string file in files)
213 infos [i++] = new FileInfo (file);
218 // directory management methods
220 public override void Delete ()
225 public void Delete (bool recursive)
227 Directory.Delete (FullPath, recursive);
230 public void MoveTo (string destDirName)
232 if (destDirName == null)
233 throw new ArgumentNullException ("destDirName");
234 if (destDirName.Length == 0)
235 throw new ArgumentException ("An empty file name is not valid.", "destDirName");
237 Directory.Move (FullPath, Path.GetFullPath (destDirName));
240 public override string ToString ()
246 public DirectoryInfo[] GetDirectories (string searchPattern, SearchOption searchOption)
248 switch (searchOption) {
249 case SearchOption.TopDirectoryOnly:
250 return GetDirectories (searchPattern);
251 case SearchOption.AllDirectories:
252 Queue workq = new Queue(GetDirectories(searchPattern));
253 Queue doneq = new Queue();
254 while (workq.Count > 0)
256 DirectoryInfo cinfo = (DirectoryInfo) workq.Dequeue();
257 DirectoryInfo[] cinfoDirs = cinfo.GetDirectories(searchPattern);
258 foreach (DirectoryInfo i in cinfoDirs) workq.Enqueue(i);
259 doneq.Enqueue(cinfo);
262 DirectoryInfo[] infos = new DirectoryInfo[doneq.Count];
263 doneq.CopyTo(infos, 0);
266 string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
267 throw new ArgumentOutOfRangeException ("searchOption", msg);
271 internal int GetFilesSubdirs (ArrayList l, string pattern)
274 FileInfo [] thisdir = null;
277 thisdir = GetFiles (pattern);
278 } catch (System.UnauthorizedAccessException){
282 count = thisdir.Length;
285 foreach (DirectoryInfo subdir in GetDirectories ()){
286 count += subdir.GetFilesSubdirs (l, pattern);
291 public FileInfo[] GetFiles (string searchPattern, SearchOption searchOption)
293 switch (searchOption) {
294 case SearchOption.TopDirectoryOnly:
295 return GetFiles (searchPattern);
296 case SearchOption.AllDirectories: {
297 ArrayList groups = new ArrayList ();
298 int count = GetFilesSubdirs (groups, searchPattern);
301 FileInfo [] all = new FileInfo [count];
302 foreach (FileInfo [] p in groups){
303 p.CopyTo (all, current);
309 string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
310 throw new ArgumentOutOfRangeException ("searchOption", msg);
314 // access control methods
316 [MonoLimitation ("DirectorySecurity isn't implemented")]
317 public void Create (DirectorySecurity directorySecurity)
319 if (directorySecurity != null)
320 throw new UnauthorizedAccessException ();
324 [MonoLimitation ("DirectorySecurity isn't implemented")]
325 public DirectoryInfo CreateSubdirectory (string path, DirectorySecurity directorySecurity)
327 if (directorySecurity != null)
328 throw new UnauthorizedAccessException ();
329 return CreateSubdirectory (path);
332 [MonoNotSupported ("DirectorySecurity isn't implemented")]
333 public DirectorySecurity GetAccessControl ()
335 throw new UnauthorizedAccessException ();
338 [MonoNotSupported ("DirectorySecurity isn't implemented")]
339 public DirectorySecurity GetAccessControl (AccessControlSections includeSections)
341 throw new UnauthorizedAccessException ();
344 [MonoLimitation ("DirectorySecurity isn't implemented")]
345 public void SetAccessControl (DirectorySecurity directorySecurity)
347 if (directorySecurity != null)
348 throw new ArgumentNullException ("directorySecurity");
349 throw new UnauthorizedAccessException ();