X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FFileInfo.cs;h=0911f8152c4827f7fdafb5f2dd993d302a651da0;hb=0146859e63468733659e108f7e8e4255e9ae0027;hp=c06bdc628087db45c683169842e593f2185bcaa6;hpb=f1f8b8a867c800b21b6a03767252403c2f72cae2;p=mono.git diff --git a/mcs/class/corlib/System.IO/FileInfo.cs b/mcs/class/corlib/System.IO/FileInfo.cs index c06bdc62808..0911f8152c4 100644 --- a/mcs/class/corlib/System.IO/FileInfo.cs +++ b/mcs/class/corlib/System.IO/FileInfo.cs @@ -11,7 +11,7 @@ //------------------------------------------------------------------------------ // -// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// Copyright (C) 2004, 2006 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 @@ -33,29 +33,44 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using System; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Security; + +#if !NET_2_1 +using System.Security.AccessControl; +#endif namespace System.IO { [Serializable] - public sealed class FileInfo : FileSystemInfo { - - + [ComVisible (true)] + public sealed class FileInfo : FileSystemInfo + { private bool exists; - public FileInfo (string path) { - CheckPath (path); - - OriginalPath = path; - FullPath = Path.GetFullPath (path); + public FileInfo (string fileName) + { + if (fileName == null) + throw new ArgumentNullException ("fileName"); + + CheckPath (fileName); + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + + OriginalPath = fileName; + FullPath = Path.GetFullPath (fileName); } - + + private FileInfo (SerializationInfo info, StreamingContext context) + : base (info, context) + { + } + internal override void InternalRefresh () { exists = File.Exists (FullPath); } - // public properties public override bool Exists { @@ -78,7 +93,7 @@ namespace System.IO { } } -#if NET_2_0 +#if !NET_2_1 public bool IsReadOnly { get { if (!Exists) @@ -96,11 +111,33 @@ namespace System.IO { if (value) attrs |= FileAttributes.ReadOnly; else - attrs &= ~FileAttributes.ReadOnly; + attrs &= ~FileAttributes.ReadOnly; File.SetAttributes(FullPath, attrs); } } + + [MonoLimitation ("File encryption isn't supported (even on NTFS).")] + [ComVisible (false)] + public void Encrypt () + { + // MS.NET support this only on NTFS file systems, i.e. it's a file-system (not a framework) feature. + // otherwise it throws a NotSupportedException (or a PlatformNotSupportedException on older OS). + // we throw the same (instead of a NotImplementedException) because most code should already be + // handling this exception to work properly. + throw new NotSupportedException (Locale.GetText ("File encryption isn't supported on any file system.")); + } + + [MonoLimitation ("File encryption isn't supported (even on NTFS).")] + [ComVisible (false)] + public void Decrypt () + { + // MS.NET support this only on NTFS file systems, i.e. it's a file-system (not a framework) feature. + // otherwise it throws a NotSupportedException (or a PlatformNotSupportedException on older OS). + // we throw the same (instead of a NotImplementedException) because most code should already be + // handling this exception to work properly. + throw new NotSupportedException (Locale.GetText ("File encryption isn't supported on any file system.")); + } #endif public long Length { @@ -126,15 +163,18 @@ namespace System.IO { // streamreader methods - public StreamReader OpenText () { + public StreamReader OpenText () + { return new StreamReader (Open (FileMode.Open, FileAccess.Read)); } - public StreamWriter CreateText () { + public StreamWriter CreateText () + { return new StreamWriter (Open (FileMode.Create, FileAccess.Write)); } - public StreamWriter AppendText () { + public StreamWriter AppendText () + { return new StreamWriter (Open (FileMode.Append, FileAccess.Write)); } @@ -144,81 +184,151 @@ namespace System.IO { { return File.Create (FullPath); } - - - public FileStream OpenRead () { + + public FileStream OpenRead () + { return Open (FileMode.Open, FileAccess.Read, FileShare.Read); } - public FileStream OpenWrite () { + public FileStream OpenWrite () + { return Open (FileMode.OpenOrCreate, FileAccess.Write); } - public FileStream Open (FileMode mode) { + public FileStream Open (FileMode mode) + { return Open (mode, FileAccess.ReadWrite); } - public FileStream Open (FileMode mode, FileAccess access) { + public FileStream Open (FileMode mode, FileAccess access) + { return Open (mode, access, FileShare.None); } - public FileStream Open (FileMode mode, FileAccess access, FileShare share) { + public FileStream Open (FileMode mode, FileAccess access, FileShare share) + { return new FileStream (FullPath, mode, access, share); } // file methods - public override void Delete () { + public override void Delete () + { MonoIOError error; - - if (!MonoIO.Exists (FullPath, out error)) { + + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + + if (!MonoIO.Exists (FullPath, out error)) // a weird MS.NET behaviour return; - } - if (MonoIO.ExistsDirectory (FullPath, out error)) { + if (MonoIO.ExistsDirectory (FullPath, out error)) throw new UnauthorizedAccessException ("Access to the path \"" + FullPath + "\" is denied."); - } - - if (!MonoIO.DeleteFile (FullPath, out error)) { - throw MonoIO.GetException (OriginalPath, - error); - } + if (!MonoIO.DeleteFile (FullPath, out error)) + throw MonoIO.GetException (OriginalPath, error); } - - public void MoveTo (string dest) { - if (dest == null) - throw new ArgumentNullException (); - - if (dest == Name || dest == FullName) - return; + public void MoveTo (string destFileName) + { + if (destFileName == null) + throw new ArgumentNullException ("destFileName"); + if (destFileName == Name || destFileName == FullName) + return; + if (!File.Exists (FullPath)) + throw new FileNotFoundException (); - MonoIOError error; - if (MonoIO.Exists (dest, out error) || - MonoIO.ExistsDirectory (dest, out error)) - throw new IOException (); - File.Move (FullPath, dest); - this.FullPath = Path.GetFullPath (dest); + File.Move (FullPath, destFileName); + this.FullPath = Path.GetFullPath (destFileName); } - public FileInfo CopyTo (string path) { - return CopyTo (path, false); + public FileInfo CopyTo (string destFileName) + { + return CopyTo (destFileName, false); } - public FileInfo CopyTo (string path, bool overwrite) { - string dest = Path.GetFullPath (path); + public FileInfo CopyTo (string destFileName, bool overwrite) + { + if (destFileName == null) + throw new ArgumentNullException ("destFileName"); + if (destFileName.Length == 0) + throw new ArgumentException ("An empty file name is not valid.", "destFileName"); + + string dest = Path.GetFullPath (destFileName); - if (overwrite && File.Exists (path)) - File.Delete (path); + if (overwrite && File.Exists (dest)) + File.Delete (dest); File.Copy (FullPath, dest); return new FileInfo (dest); } - public override string ToString () { + public override string ToString () + { +#if NET_2_1 + // for Moonlight we *never* return paths, since ToString is not [SecurityCritical] we simply return the Name + return Name; +#else return OriginalPath; +#endif } + +#if !NET_2_1 + public FileSecurity GetAccessControl () + { + return File.GetAccessControl (FullPath); + } + + public FileSecurity GetAccessControl (AccessControlSections includeSections) + { + return File.GetAccessControl (FullPath, includeSections); + } + + [ComVisible (false)] + public FileInfo Replace (string destinationFileName, + string destinationBackupFileName) + { + string destinationFullPath = null; + if (!Exists) + throw new FileNotFoundException (); + if (destinationFileName == null) + throw new ArgumentNullException ("destinationFileName"); + if (destinationFileName.Length == 0) + throw new ArgumentException ("An empty file name is not valid.", "destinationFileName"); + + destinationFullPath = Path.GetFullPath (destinationFileName); + + if (!File.Exists (destinationFullPath)) + throw new FileNotFoundException (); + + FileAttributes attrs = File.GetAttributes (destinationFullPath); + + if ( (attrs & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) + throw new UnauthorizedAccessException (); + + if (destinationBackupFileName != null) { + if (destinationBackupFileName.Length == 0) + throw new ArgumentException ("An empty file name is not valid.", "destinationBackupFileName"); + File.Copy (destinationFullPath, Path.GetFullPath (destinationBackupFileName), true); + } + File.Copy (FullPath, destinationFullPath,true); + File.Delete (FullPath); + return new FileInfo (destinationFullPath); + } + + [ComVisible (false)] + [MonoLimitation ("We ignore the ignoreMetadataErrors parameter")] + public FileInfo Replace (string destinationFileName, + string destinationBackupFileName, + bool ignoreMetadataErrors) + { + return Replace (destinationFileName, destinationBackupFileName); + } + + public void SetAccessControl (FileSecurity fileSecurity) + { + File.SetAccessControl (FullPath, fileSecurity); + } +#endif } }