X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FDirectory.cs;h=dfc6049f1bc8f2bfcfce0e246f80464f95a30630;hb=7c970f8ee1f635da8575bcf58d89c16bb5c2ace1;hp=9e0748e9707c4e817a7e7e69bbc34d4ba5f78641;hpb=a3ea7ceb4d4f5e2cb8ea421313e8939640fb898c;p=mono.git diff --git a/mcs/class/corlib/System.IO/Directory.cs b/mcs/class/corlib/System.IO/Directory.cs index 9e0748e9707..dfc6049f1bc 100644 --- a/mcs/class/corlib/System.IO/Directory.cs +++ b/mcs/class/corlib/System.IO/Directory.cs @@ -42,9 +42,16 @@ using System.Collections; using System.Security; using System.Security.Permissions; using System.Text; +#if NET_2_0 +using System.Security.AccessControl; +using System.Runtime.InteropServices; +#endif namespace System.IO { +#if NET_2_0 + [ComVisible (true)] +#endif public #if NET_2_0 static @@ -71,6 +78,11 @@ namespace System.IO if (path.Trim ().Length == 0) throw new ArgumentException ("Only blank characters in path"); + +#if NET_2_0 + if (File.Exists(path)) + throw new IOException ("Cannot create " + path + " because a file with the same name already exists."); +#endif // LAMESPEC: with .net 1.0 version this throw NotSupportedException and msdn says so too // but v1.1 throws ArgumentException. @@ -80,6 +92,14 @@ namespace System.IO return CreateDirectoriesInternal (path); } +#if NET_2_0 + [MonoTODO ("DirectorySecurity not implemented")] + public static DirectoryInfo CreateDirectory (string path, DirectorySecurity directorySecurity) + { + return(CreateDirectory (path)); + } +#endif + static DirectoryInfo CreateDirectoriesInternal (string path) { if (SecurityManager.SecurityEnabled) { @@ -127,15 +147,25 @@ namespace System.IO throw new NotSupportedException ("Only ':' In path"); MonoIOError error; + bool success; + + if (MonoIO.ExistsSymlink (path, out error)) { + /* RemoveDirectory maps to rmdir() + * which fails on symlinks (ENOTDIR) + */ + success = MonoIO.DeleteFile (path, out error); + } else { + success = MonoIO.RemoveDirectory (path, out error); + } - if (!MonoIO.RemoveDirectory (path, out error)) { + if (!success) { /* * FIXME: * In io-layer/io.c rmdir returns error_file_not_found if directory does not exists. * So maybe this could be handled somewhere else? */ if (error == MonoIOError.ERROR_FILE_NOT_FOUND) - throw new DirectoryNotFoundException ("Directory '" + path + "' doesnt exists."); + throw new DirectoryNotFoundException ("Directory '" + path + "' does not exist"); else throw MonoIO.GetException (path, error); } @@ -143,8 +173,15 @@ namespace System.IO static void RecursiveDelete (string path) { - foreach (string dir in GetDirectories (path)) - RecursiveDelete (dir); + MonoIOError error; + + foreach (string dir in GetDirectories (path)) { + if (MonoIO.ExistsSymlink (dir, out error)) { + MonoIO.DeleteFile (dir, out error); + } else { + RecursiveDelete (dir); + } + } foreach (string file in GetFiles (path)) File.Delete (file); @@ -192,12 +229,12 @@ namespace System.IO { return File.GetLastAccessTime (path); } - + public static DateTime GetLastAccessTimeUtc (string path) { return GetLastAccessTime (path).ToUniversalTime (); } - + public static DateTime GetLastWriteTime (string path) { return File.GetLastWriteTime (path); @@ -311,15 +348,15 @@ namespace System.IO static bool IsRootDirectory (string path) { // Unix - if (Path.DirectorySeparatorChar == '/' && path == "/") - return true; + if (Path.DirectorySeparatorChar == '/' && path == "/") + return true; - // Windows - if (Path.DirectorySeparatorChar == '\\') - if (path.Length == 3 && path.EndsWith (":\\")) - return true; + // Windows + if (Path.DirectorySeparatorChar == '\\') + if (path.Length == 3 && path.EndsWith (":\\")) + return true; - return false; + return false; } public static DirectoryInfo GetParent (string path) @@ -342,34 +379,41 @@ namespace System.IO return new DirectoryInfo (parent_name); } - public static void Move (string src, string dest) + public static void Move (string sourceDirName, string destDirName) { - if (src == null) - throw new ArgumentNullException ("src"); + if (sourceDirName == null) + throw new ArgumentNullException ("sourceDirName"); - if (dest == null) - throw new ArgumentNullException ("dest"); + if (destDirName == null) + throw new ArgumentNullException ("destDirName"); - if (src.Trim () == "" || src.IndexOfAny (Path.InvalidPathChars) != -1) - throw new ArgumentException ("Invalid source directory name: " + src, "src"); + if (sourceDirName.Trim () == "" || sourceDirName.IndexOfAny (Path.InvalidPathChars) != -1) + throw new ArgumentException ("Invalid source directory name: " + sourceDirName, "sourceDirName"); - if (dest.Trim () == "" || dest.IndexOfAny (Path.InvalidPathChars) != -1) - throw new ArgumentException ("Invalid target directory name: " + dest, "dest"); + if (destDirName.Trim () == "" || destDirName.IndexOfAny (Path.InvalidPathChars) != -1) + throw new ArgumentException ("Invalid target directory name: " + destDirName, "destDirName"); - if (src == dest) - throw new IOException ("Source directory cannot be same as a target directory."); + if (sourceDirName == destDirName) + throw new IOException ("Source and destination path must be different."); - if (Exists (dest)) - throw new IOException (dest + " already exists."); + if (Exists (destDirName)) + throw new IOException (destDirName + " already exists."); - if (!Exists (src)) - throw new DirectoryNotFoundException (src + " does not exist"); + if (!Exists (sourceDirName) && !File.Exists (sourceDirName)) + throw new DirectoryNotFoundException (sourceDirName + " does not exist"); MonoIOError error; - if (!MonoIO.MoveFile (src, dest, out error)) + if (!MonoIO.MoveFile (sourceDirName, destDirName, out error)) throw MonoIO.GetException (error); } +#if NET_2_0 + public static void SetAccessControl (string path, DirectorySecurity directorySecurity) + { + throw new NotImplementedException (); + } +#endif + public static void SetCreationTime (string path, DateTime creation_time) { File.SetCreationTime (path, creation_time); @@ -477,12 +521,26 @@ namespace System.IO throw new ArgumentException ("Path is invalid", "path"); } - string [] result = MonoIO.GetFileSystemEntries (wildpath, pattern, (int) attrs, (int) mask, out error); + string path_with_pattern = Path.Combine (wildpath, pattern); + string [] result = MonoIO.GetFileSystemEntries (path, path_with_pattern, (int) attrs, (int) mask, out error); if (error != 0) throw MonoIO.GetException (wildpath, error); - + return result; } + +#if NET_2_0 + [MonoNotSupported ("DirectorySecurity isn't implemented")] + public static DirectorySecurity GetAccessControl (string path, AccessControlSections includeSections) + { + throw new PlatformNotSupportedException (); + } + + [MonoNotSupported ("DirectorySecurity isn't implemented")] + public static DirectorySecurity GetAccessControl (string path) + { + throw new PlatformNotSupportedException (); + } +#endif } } -