2007-04-24 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / corlib / System.IO / FileInfo.cs
index 3345f61dc79dd7ea66f06fd38a75affae389c49a..7ba28dce4c7e3978e6b05deb27e4b3c40f997042 100644 (file)
@@ -1,17 +1,17 @@
-//------------------------------------------------------------------------------\r
-// \r
-// System.IO.FileInfo.cs \r
-//\r
-// Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved\r
-// \r
-// Author:         Jim Richardson, develop@wtfo-guru.com\r
-//                 Dan Lewis (dihlewis@yahoo.co.uk)\r
-// Created:        Monday, August 13, 2001 \r
-//\r
-//------------------------------------------------------------------------------\r
+//------------------------------------------------------------------------------
+// 
+// System.IO.FileInfo.cs 
+//
+// Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved
+// 
+// Author:         Jim Richardson, develop@wtfo-guru.com
+//                 Dan Lewis (dihlewis@yahoo.co.uk)
+// Created:        Monday, August 13, 2001 
+//
+//------------------------------------------------------------------------------
 
 //
-// 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
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-\r
-using System;\r
-\r
-namespace System.IO {\r
-\r
-       [Serializable]\r
-       public sealed class FileInfo : FileSystemInfo {\r
-       \r
-\r
-               private bool exists;\r
-\r
-               public FileInfo (string path) {\r
-                       CheckPath (path);\r
-               \r
-                       OriginalPath = path;\r
-                       FullPath = Path.GetFullPath (path);\r
-               }\r
-               \r
-               internal override void InternalRefresh ()\r
-               {\r
-                       exists = File.Exists (FullPath);\r
-               }\r
-\r
-\r
-               // public properties\r
-\r
-               public override bool Exists {\r
-                       get {\r
-                               Refresh (false);\r
-\r
-                               if (stat.Attributes == MonoIO.InvalidFileAttributes)\r
-                                       return false;\r
-\r
-                               if ((stat.Attributes & FileAttributes.Directory) != 0)\r
-                                       return false;\r
-\r
-                               return exists;\r
-                       }\r
-               }\r
-\r
-               public override string Name {\r
-                       get {\r
-                               return Path.GetFileName (FullPath);\r
-                       }\r
-               }\r
-\r
-               public long Length {\r
-                       get {\r
-                               if (!Exists)\r
-                                       throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".", OriginalPath);\r
-\r
-                               return stat.Length;\r
-                       }\r
-               }\r
-\r
-               public string DirectoryName {\r
-                       get {\r
-                               return Path.GetDirectoryName (FullPath);\r
-                       }\r
-               }\r
-\r
-               public DirectoryInfo Directory {\r
-                       get {\r
-                               return new DirectoryInfo (DirectoryName);\r
-                       }\r
-               }\r
-\r
-               // streamreader methods\r
-\r
-               public StreamReader OpenText () {\r
-                       return new StreamReader (Open (FileMode.Open, FileAccess.Read));\r
-               }\r
-\r
-               public StreamWriter CreateText () {\r
-                       return new StreamWriter (Open (FileMode.Create, FileAccess.Write));\r
-               }\r
-               \r
-               public StreamWriter AppendText () {\r
-                       return new StreamWriter (Open (FileMode.Append, FileAccess.Write));\r
-               }\r
-\r
-               // filestream methods\r
-\r
-               public FileStream Create ()\r
-               {\r
-                       return File.Create (FullPath);\r
-               }\r
-               \r
-               \r
-               public FileStream OpenRead () {\r
-                       return Open (FileMode.Open, FileAccess.Read);\r
-               }\r
-\r
-               public FileStream OpenWrite () {\r
-                       return Open (FileMode.OpenOrCreate, FileAccess.Write);\r
-               }\r
-\r
-               public FileStream Open (FileMode mode) {\r
-                       return Open (mode, FileAccess.ReadWrite);\r
-               }\r
-\r
-               public FileStream Open (FileMode mode, FileAccess access) {\r
-                       return Open (mode, access, FileShare.None);\r
-               }\r
-\r
-               public FileStream Open (FileMode mode, FileAccess access, FileShare share) {\r
-                       return new FileStream (FullPath, mode, access, share);\r
-               }\r
-\r
-               // file methods\r
-\r
-               public override void Delete () {\r
-                       MonoIOError error;\r
-                                               \r
-                       if (!MonoIO.Exists (FullPath, out error)) {\r
-                               // a weird MS.NET behaviour\r
-                               return;\r
-                       }\r
-\r
-                       if (MonoIO.ExistsDirectory (FullPath, out error)) {\r
-                               throw new UnauthorizedAccessException ("Access to the path \"" + FullPath + "\" is denied.");\r
-                       }\r
-                       \r
-                       if (!MonoIO.DeleteFile (FullPath, out error)) {\r
-                               throw MonoIO.GetException (OriginalPath,\r
-                                                          error);\r
-                       }\r
-               }\r
-               \r
-               public void MoveTo (string dest) {\r
-\r
-                       if (dest == null)\r
-                               throw new ArgumentNullException ();\r
-\r
-                        if (dest == Name || dest == FullName)\r
-                                return;\r
-\r
-                       MonoIOError error;\r
-                       if (MonoIO.Exists (dest, out error) ||\r
-                               MonoIO.ExistsDirectory (dest, out error))\r
-                               throw new IOException ();\r
-                       File.Move (FullPath, dest);\r
-                       this.FullPath = Path.GetFullPath (dest);\r
-               }\r
-\r
-               public FileInfo CopyTo (string path) {\r
-                       return CopyTo (path, false);\r
-               }\r
-\r
-               public FileInfo CopyTo (string path, bool overwrite) {\r
-                       string dest = Path.GetFullPath (path);\r
-\r
-                       if (overwrite && File.Exists (path))\r
-                               File.Delete (path);\r
-\r
-                       File.Copy (FullPath, dest);\r
-               \r
-                       return new FileInfo (dest);\r
-               }\r
-\r
-               public override string ToString () {\r
-                       return OriginalPath;\r
-               }\r
-       }\r
-}\r
+
+using System.Runtime.InteropServices;
+
+namespace System.IO {
+
+       [Serializable]
+#if NET_2_0
+       [ComVisible (true)]
+#endif
+       public sealed class FileInfo : FileSystemInfo {
+       
+
+               private bool exists;
+
+               public FileInfo (string path) {
+                       CheckPath (path);
+               
+                       OriginalPath = path;
+                       FullPath = Path.GetFullPath (path);
+               }
+               
+               internal override void InternalRefresh ()
+               {
+                       exists = File.Exists (FullPath);
+               }
+
+
+               // public properties
+
+               public override bool Exists {
+                       get {
+                               Refresh (false);
+
+                               if (stat.Attributes == MonoIO.InvalidFileAttributes)
+                                       return false;
+
+                               if ((stat.Attributes & FileAttributes.Directory) != 0)
+                                       return false;
+
+                               return exists;
+                       }
+               }
+
+               public override string Name {
+                       get {
+                               return Path.GetFileName (FullPath);
+                       }
+               }
+
+#if NET_2_0
+               public bool IsReadOnly {
+                       get {
+                               if (!Exists)
+                                       throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".", OriginalPath);
+                                       
+                               return ((stat.Attributes & FileAttributes.ReadOnly) != 0);
+                       }
+                               
+                       set {
+                               if (!Exists)
+                                       throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".", OriginalPath);
+                                       
+                               FileAttributes attrs = File.GetAttributes(FullPath);
+
+                               if (value) 
+                                       attrs |= FileAttributes.ReadOnly;
+                               else
+                                       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 {
+                       get {
+                               if (!Exists)
+                                       throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".", OriginalPath);
+
+                               return stat.Length;
+                       }
+               }
+
+               public string DirectoryName {
+                       get {
+                               return Path.GetDirectoryName (FullPath);
+                       }
+               }
+
+               public DirectoryInfo Directory {
+                       get {
+                               return new DirectoryInfo (DirectoryName);
+                       }
+               }
+
+               // streamreader methods
+
+               public StreamReader OpenText () {
+                       return new StreamReader (Open (FileMode.Open, FileAccess.Read));
+               }
+
+               public StreamWriter CreateText () {
+                       return new StreamWriter (Open (FileMode.Create, FileAccess.Write));
+               }
+               
+               public StreamWriter AppendText () {
+                       return new StreamWriter (Open (FileMode.Append, FileAccess.Write));
+               }
+
+               // filestream methods
+
+               public FileStream Create ()
+               {
+                       return File.Create (FullPath);
+               }
+               
+               
+               public FileStream OpenRead () {
+                       return Open (FileMode.Open, FileAccess.Read, FileShare.Read);
+               }
+
+               public FileStream OpenWrite () {
+                       return Open (FileMode.OpenOrCreate, FileAccess.Write);
+               }
+
+               public FileStream Open (FileMode mode) {
+                       return Open (mode, FileAccess.ReadWrite);
+               }
+
+               public FileStream Open (FileMode mode, FileAccess access) {
+                       return Open (mode, access, FileShare.None);
+               }
+
+               public FileStream Open (FileMode mode, FileAccess access, FileShare share) {
+                       return new FileStream (FullPath, mode, access, share);
+               }
+
+               // file methods
+
+               public override void Delete () {
+                       MonoIOError error;
+                                               
+                       if (!MonoIO.Exists (FullPath, out error)) {
+                               // a weird MS.NET behaviour
+                               return;
+                       }
+
+                       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);
+                       }
+               }
+               
+               public void MoveTo (string dest) {
+
+                       if (dest == null)
+                               throw new ArgumentNullException ();
+
+                        if (dest == Name || dest == FullName)
+                                return;
+
+                       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);
+               }
+
+               public FileInfo CopyTo (string path) {
+                       return CopyTo (path, false);
+               }
+
+               public FileInfo CopyTo (string path, bool overwrite) {
+                       string dest = Path.GetFullPath (path);
+
+                       if (overwrite && File.Exists (path))
+                               File.Delete (path);
+
+                       File.Copy (FullPath, dest);
+               
+                       return new FileInfo (dest);
+               }
+
+               public override string ToString () {
+                       return OriginalPath;
+               }
+       }
+}