X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FMonoIO.cs;h=0dbd3d67570414b4ef9735761f3b46732affacfe;hb=3c39ac4586b4470703fb4af0208b5baf1de70e43;hp=36ef4e806f4823f0ed4f8d753e0da1f645d6e3b0;hpb=5e6643734df34c002b914b3d44c91ed897a8a6d6;p=mono.git diff --git a/mcs/class/corlib/System.IO/MonoIO.cs b/mcs/class/corlib/System.IO/MonoIO.cs index 36ef4e806f4..0dbd3d67570 100644 --- a/mcs/class/corlib/System.IO/MonoIO.cs +++ b/mcs/class/corlib/System.IO/MonoIO.cs @@ -34,6 +34,9 @@ using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; +#if NET_2_1 +using System.IO.IsolatedStorage; +#endif namespace System.IO { @@ -47,7 +50,27 @@ namespace System.IO // 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."); + case MonoIOError.ERROR_FILE_EXISTS: + string message = "Cannot create a file that already exist."; + return new IOException (message, unchecked ((int) 0x80070000) | (int) error); + 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, @@ -59,15 +82,22 @@ namespace System.IO // FIXME: add more exception mappings here case MonoIOError.ERROR_FILE_NOT_FOUND: message = String.Format ("Could not find file \"{0}\"", path); - return new FileNotFoundException (message, - path); +#if NET_2_1 + return new IsolatedStorageException (message); +#else + return new FileNotFoundException (message, path); +#endif 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); +#if NET_2_1 + return new IsolatedStorageException (message); +#else return new DirectoryNotFoundException (message); +#endif case MonoIOError.ERROR_ACCESS_DENIED: message = String.Format ("Access to the path \"{0}\" is denied.", path); @@ -75,11 +105,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_1 + 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); @@ -87,27 +123,42 @@ 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); + 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); + 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); + + case MonoIOError.ERROR_NOT_SAME_DEVICE: + message = "Source and destination are not on the same device"; + 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); } } @@ -120,14 +171,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); @@ -150,6 +194,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); @@ -202,6 +253,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 +279,7 @@ namespace System.IO FileMode mode, FileAccess access, FileShare share, - bool async, + FileOptions options, out MonoIOError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] @@ -305,7 +370,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; @@ -363,6 +428,10 @@ namespace System.IO [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static bool CreatePipe (out IntPtr read_handle, out IntPtr write_handle); + [MethodImplAttribute (MethodImplOptions.InternalCall)] + public extern static bool DuplicateHandle (IntPtr source_process_handle, IntPtr source_handle, + IntPtr target_process_handle, out IntPtr target_handle, int access, int inherit, int options); + // path characters public extern static char VolumeSeparatorChar { @@ -385,11 +454,6 @@ namespace System.IO get; } - public extern static char [] InvalidPathChars { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } - [MethodImplAttribute (MethodImplOptions.InternalCall)] public extern static int GetTempPath(out string path); }