// 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
\r
using System;\r
-using System.PAL;\r
-using System.Diagnostics;\r
-using System.Security.Permissions;\r
-\r
-namespace System.IO\r
-{\r
- /// <summary>\r
- /// \r
- /// </summary>\r
- public sealed class FileInfo : FileSystemInfo\r
- {\r
- private OpSys _os = Platform.OS;\r
-\r
- public FileInfo(string fileName)\r
- {\r
- CheckArgument.Path(fileName, false);\r
- //LAMESPEC: Does not throw security exception in constructor\r
- OriginalPath = fileName;\r
- }\r
\r
- private bool existsOnDisk(bool exNotFound, bool exIsDirectory)\r
- {\r
- bool bRetCode;\r
- \r
- try\r
- {\r
- Refresh();\r
- if((getAttributes() & FileAttributes.Directory) != 0)\r
- {\r
- if(exIsDirectory)\r
- {\r
- throw new UnauthorizedAccessException();\r
- }\r
- bRetCode = false;\r
- }\r
- else\r
- {\r
- bRetCode = true;\r
- }\r
- }\r
- catch(ArgumentException ex) \r
- {\r
- Debug.WriteLine(ex); // eliminates not used warning\r
- if(exNotFound)\r
- {\r
- throw new FileNotFoundException();\r
- }\r
- bRetCode = false;\r
- }\r
- return bRetCode;\r
+namespace System.IO {\r
+\r
+ [Serializable]
+ public sealed class FileInfo : FileSystemInfo {\r
+ \r
+
+ private bool exists;
+
+ public FileInfo (string path) {\r
+ CheckPath (path);\r
+ \r
+ OriginalPath = path;\r
+ FullPath = Path.GetFullPath (path);
}\r
\r
- public override bool Exists\r
+ internal override void InternalRefresh ()\r
{\r
- get\r
- {\r
- return existsOnDisk(false, false); \r
- }\r
+ exists = File.Exists (FullPath);\r
}\r
\r
- public override string Name\r
- {\r
- get\r
- {\r
- return Path.GetFileName(getPathName());\r
- }\r
- }\r
\r
- /// <summary>\r
- /// Gets the parent directory info\r
- /// </summary>\r
- public DirectoryInfo Directory\r
- {\r
- get\r
- {\r
- return new DirectoryInfo(Path.GetDirectoryName(getPathName()));\r
- }\r
- }\r
+ // public properties\r
\r
- /// <summary>\r
- /// Get the path of the file\r
- /// </summary>\r
- public string DirectoryName\r
- {\r
- get\r
- {\r
- return Path.GetDirectoryName(getPathName());\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
- /// <summary>\r
- /// Get the length of the file\r
- /// </summary>\r
- public long Length\r
- {\r
- get\r
- {\r
- try\r
- {\r
- Refresh();\r
- }\r
- catch(ArgumentException ex)\r
- {\r
- Debug.WriteLine(ex); // eliminates not used compiler warning\r
- throw new FileNotFoundException();\r
- }\r
- return _os.FileLength(getPathName());\r
+ public override string Name {\r
+ get {\r
+ return Path.GetFileName (FullPath);\r
}\r
}\r
\r
- [MonoTODO]\r
- public StreamWriter AppendText()\r
- { // TODO: verify using correct FileMode here might be Create & Append\r
- return new StreamWriter(Open(FileMode.Append, FileAccess.Write));\r
- }\r
+ public long Length {\r
+ get {\r
+ if (!Exists)\r
+ throw new FileNotFoundException ("Could not find file \"" + OriginalPath + "\".");\r
\r
- [MonoTODO]\r
- public FileStream Create()\r
- {\r
- // TODO: verify using correct FileMode here\r
- return Open(FileMode.OpenOrCreate, FileAccess.ReadWrite);\r
- }\r
-\r
- [MonoTODO]\r
- public StreamWriter CreateText()\r
- { //TODO: According to doc even CreateText throws a file not found ex\r
- // sounds suspicious so i'll have to check it out later\r
- //existsOnDisk(true, true); // throw not found, is directory\r
- return new StreamWriter(Open(FileMode.Create, FileAccess.Write));\r
- }\r
- \r
- public FileStream Open(FileMode mode)\r
- {\r
- return Open(mode, FileAccess.ReadWrite);\r
+ return stat.Length;\r
+ }\r
}\r
\r
- public FileStream Open(FileMode mode, FileAccess access)\r
- {\r
- return Open(mode, access, FileShare.None);\r
- }\r
- \r
- public FileStream Open(FileMode mode, FileAccess access, FileShare share)\r
- {\r
- bool bExists = existsOnDisk(false, true); // throw is directory;\r
- string path = getPathName();\r
- CheckPermission.ModeAccess(mode, access, path, bExists); \r
- return new FileStream(path, mode, access, share);\r
+ public string DirectoryName {\r
+ get {\r
+ return Path.GetDirectoryName (FullPath);\r
+ }\r
}\r
\r
- [MonoTODO]\r
- public FileStream OpenRead()\r
- { // TODO: find out what default share should be\r
- return Open(FileMode.Open, FileAccess.Read, FileShare.Read);\r
+ public DirectoryInfo Directory {\r
+ get {\r
+ return new DirectoryInfo (DirectoryName);\r
+ }\r
}\r
\r
- [MonoTODO]\r
- public StreamReader OpenText()\r
- { // TODO: verify mode and access values\r
- return new StreamReader(Open(FileMode.OpenOrCreate, FileAccess.ReadWrite));\r
- }\r
+ // streamreader methods\r
\r
- public FileStream OpenWrite()\r
- {\r
- return Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);\r
+ public StreamReader OpenText () {\r
+ return new StreamReader (Open (FileMode.Open, FileAccess.Read));\r
}\r
\r
- public FileInfo CopyTo(string destFile)\r
- {\r
- return CopyTo(destFile, false);\r
+ public StreamWriter CreateText () {\r
+ return new StreamWriter (Open (FileMode.Create, FileAccess.Write));\r
}\r
-\r
- [MonoTODO]\r
- public FileInfo CopyTo(string destFile, bool bOverwrite)\r
- { // TODO: Implement\r
- return null;\r
+ \r
+ public StreamWriter AppendText () {\r
+ return new StreamWriter (Open (FileMode.Append, FileAccess.Write));\r
}\r
\r
- public override void Delete()\r
- {\r
- existsOnDisk(true, true); // throw not found, is directory\r
- CheckPermission.Demand(FileIOPermissionAccess.AllAccess, getPathName());\r
- _os.DeleteFile(getPathName());\r
+ // filestream methods\r
+
+ public FileStream Create ()
+ {
+ return File.Create (FullPath);
+ }
+
+ \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
+
+ 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 ();
+ 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) {\r
+ return CopyTo (path, false);\r
+ }\r
+\r
+ public FileInfo CopyTo (string path, bool overwrite) {\r
+ string dest = Path.GetFullPath (path);\r
+
+ if (overwrite && File.Exists (path))
+ File.Delete (path);
+
+ File.Copy (FullPath, dest);\r
+ \r
+ return new FileInfo (dest);\r
}\r
\r
- [MonoTODO]\r
- public void MoveTo(string destName)\r
- { // TODO: Implement\r
+ public override string ToString () {\r
+ return OriginalPath;\r
}\r
}\r
}\r