X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FMonoIO.cs;h=a1f4ed5deaab05904407d248624ba761249a13a9;hb=a4039fa632aedad177c3d90a38396469bfee3295;hp=5f7994e9ce2f2db07749d495987443b24fdabaed;hpb=72ba6e6fee75eae795a2192c189141049773f4f9;p=mono.git diff --git a/mcs/class/corlib/System.IO/MonoIO.cs b/mcs/class/corlib/System.IO/MonoIO.cs index 5f7994e9ce2..a1f4ed5deaa 100644 --- a/mcs/class/corlib/System.IO/MonoIO.cs +++ b/mcs/class/corlib/System.IO/MonoIO.cs @@ -1,4 +1,3 @@ -// // System.IO.MonoIO.cs: static interface to native filesystem. // // Author: @@ -45,13 +44,27 @@ namespace System.IO public static readonly IntPtr InvalidHandle = (IntPtr)(-1L); - public static readonly bool SupportsAsync = GetSupportsAsync (); - // error methods - public static Exception GetException (MonoIOError error) { - return GetException (String.Empty, error); + /* This overload is currently only called from + * File.MoveFile(), Directory.Move() and + * Directory.GetCurrentDirectory() - + * everywhere else supplies a path to format + * with the error text. + */ + switch(error) { + case MonoIOError.ERROR_ACCESS_DENIED: + return new UnauthorizedAccessException ("Access to the path is denied."); + default: + /* Add more mappings here if other + * errors trigger the named but empty + * path bug (see bug 82141.) For + * everything else, fall through to + * the other overload + */ + return GetException (String.Empty, error); + } } public static Exception GetException (string path, @@ -67,7 +80,7 @@ namespace System.IO path); case MonoIOError.ERROR_TOO_MANY_OPEN_FILES: - return new IOException ("Too many open files"); + return new IOException ("Too many open files", unchecked((int)0x80070000) | (int)error); case MonoIOError.ERROR_PATH_NOT_FOUND: message = String.Format ("Could not find a part of the path \"{0}\"", path); @@ -79,11 +92,17 @@ namespace System.IO case MonoIOError.ERROR_INVALID_HANDLE: message = String.Format ("Invalid handle to path \"{0}\"", path); - return new IOException (message); - + return new IOException (message, unchecked((int)0x80070000) | (int)error); + case MonoIOError.ERROR_INVALID_DRIVE: + message = String.Format ("Could not find the drive '{0}'. The drive might not be ready or might not be mapped.", path); +#if NET_2_0 + return new DriveNotFoundException (message); +#else + return new IOException (message, unchecked((int)0x80070000) | (int)error); +#endif case MonoIOError.ERROR_FILE_EXISTS: message = String.Format ("Could not create file \"{0}\". File already exists.", path); - return new IOException (message); + return new IOException (message, unchecked((int)0x80070000) | (int)error); case MonoIOError.ERROR_FILENAME_EXCED_RANGE: message = String.Format ("Path is too long. Path: {0}", path); @@ -91,19 +110,38 @@ namespace System.IO case MonoIOError.ERROR_INVALID_PARAMETER: message = String.Format ("Invalid parameter"); - return new IOException (message); + return new IOException (message, unchecked((int)0x80070000) | (int)error); + + case MonoIOError.ERROR_WRITE_FAULT: + message = String.Format ("Write fault on path {0}", path); + return new IOException (message, unchecked((int)0x80070000) | (int)error); case MonoIOError.ERROR_SHARING_VIOLATION: message = String.Format ("Sharing violation on path {0}", path); - return new IOException (message); + return new IOException (message, unchecked((int)0x80070000) | (int)error); case MonoIOError.ERROR_LOCK_VIOLATION: message = String.Format ("Lock violation on path {0}", path); - return new IOException (message); + return new IOException (message, unchecked((int)0x80070000) | (int)error); + + case MonoIOError.ERROR_HANDLE_DISK_FULL: + message = String.Format ("Disk full. Path {0}", path); + return new IOException (message, unchecked((int)0x80070000) | (int)error); + + case MonoIOError.ERROR_DIR_NOT_EMPTY: + message = String.Format ("Directory {0} is not empty", path); + return new IOException (message, unchecked((int)0x80070000) | (int)error); + + case MonoIOError.ERROR_ENCRYPTION_FAILED: + return new IOException ("Encryption failed", unchecked((int)0x80070000) | (int)error); + + case MonoIOError.ERROR_CANNOT_MAKE: + message = String.Format ("Path {0} is a directory", path); + return new IOException (message, unchecked((int)0x80070000) | (int)error); default: message = String.Format ("Win32 IO returned {0}. Path: {1}", error, path); - return new IOException (message); + return new IOException (message, unchecked((int)0x80070000) | (int)error); } } @@ -116,14 +154,7 @@ namespace System.IO public extern static bool RemoveDirectory (string path, out MonoIOError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static IntPtr FindFirstFile (string path, out MonoIOStat stat, out MonoIOError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static bool FindNextFile (IntPtr find, out MonoIOStat stat, out MonoIOError error); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static bool FindClose (IntPtr find, - out MonoIOError error); + public extern static string [] GetFileSystemEntries (string path, string path_with_pattern, int attrs, int mask, out MonoIOError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static string GetCurrentDirectory (out MonoIOError error); @@ -146,6 +177,13 @@ namespace System.IO public extern static bool DeleteFile (string path, out MonoIOError error); + [MethodImplAttribute (MethodImplOptions.InternalCall)] + public extern static bool ReplaceFile (string sourceFileName, + string destinationFileName, + string destinationBackupFileName, + bool ignoreMetadataErrors, + out MonoIOError error); + [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static FileAttributes GetFileAttributes (string path, out MonoIOError error); @@ -155,10 +193,6 @@ namespace System.IO [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static MonoFileType GetFileType (IntPtr handle, out MonoIOError error); - // aio_* methods - [MethodImplAttribute (MethodImplOptions.InternalCall)] - extern static bool GetSupportsAsync (); - public static bool Exists (string path, out MonoIOError error) { FileAttributes attrs = GetFileAttributes (path, @@ -202,6 +236,20 @@ namespace System.IO return true; } + public static bool ExistsSymlink (string path, + out MonoIOError error) + { + FileAttributes attrs = GetFileAttributes (path, + out error); + if (attrs == InvalidFileAttributes) + return false; + + if ((attrs & FileAttributes.ReparsePoint) == 0) + return false; + + return true; + } + [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static bool GetFileStat (string path, out MonoIOStat stat, @@ -214,7 +262,7 @@ namespace System.IO FileMode mode, FileAccess access, FileShare share, - bool async, + FileOptions options, out MonoIOError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] @@ -305,7 +353,7 @@ namespace System.IO handle = Open (path, FileMode.Open, FileAccess.ReadWrite, - FileShare.ReadWrite, false, out error); + FileShare.ReadWrite, FileOptions.None, out error); if (handle == MonoIO.InvalidHandle) return false; @@ -385,20 +433,8 @@ namespace System.IO get; } - public extern static char [] InvalidPathChars { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static int GetTempPath(out string path); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void BeginWrite (IntPtr handle,FileStreamAsyncResult ares); - - [MethodImplAttribute (MethodImplOptions.InternalCall)] - public extern static void BeginRead (IntPtr handle, FileStreamAsyncResult ares); - } }