X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FFileSystemInfo.cs;h=9c2c3fae9f05eb3f21e12028c6c38e6d343370f9;hb=b52c963187c59fd167cfde556dfd4304f8ded041;hp=78401f05c4d0d2c223dfb846d5d4f6add1f97566;hpb=de8d7509951154853e63a7b38d9be3b82ab0baab;p=mono.git diff --git a/mcs/class/corlib/System.IO/FileSystemInfo.cs b/mcs/class/corlib/System.IO/FileSystemInfo.cs index 78401f05c4d..9c2c3fae9f0 100644 --- a/mcs/class/corlib/System.IO/FileSystemInfo.cs +++ b/mcs/class/corlib/System.IO/FileSystemInfo.cs @@ -3,220 +3,268 @@ // System.IO.FileSystemInfo.cs // // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved +// Copyright 2011 Xamarin Inc (http://www.xamarin.com). // // Author: Jim Richardson, develop@wtfo-guru.com +// Dan Lewis (dihlewis@yahoo.co.uk) // Created: Monday, August 13, 2001 // //------------------------------------------------------------------------------ -using System; - -namespace System.IO -{ - /// - /// - /// - public abstract class FileSystemInfo : MarshalByRefObject - { - // protected stat status; - private bool inited; - - protected string FullPath; - protected string OriginalPath; +// +// Copyright (C) 2004-2005 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 +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Security; +using System.Security.Permissions; + +namespace System.IO { + + [Serializable] + [FileIOPermission (SecurityAction.InheritanceDemand, Unrestricted = true)] + [ComVisible (true)] +#if NET_2_1 + public abstract class FileSystemInfo { +#else + public abstract class FileSystemInfo : MarshalByRefObject, ISerializable { + + #region Implementation of ISerializable - protected FileSystemInfo() + [ComVisible(false)] + public virtual void GetObjectData (SerializationInfo info, StreamingContext context) { - /* - status.st_dev = 0; - status.st_mode = 0; - status.st_nlink = 0; - status.st_uid = 0; - status.st_gid = 0; - status.st_size = 0; - status.st_atime = 0; - status.st_mtime = 0; - status.st_ctime = 0; - */ - - FullPath = OriginalPath = String.Empty; - } - - [MonoTODO] - public FileAttributes Attributes - { - get - { - return getAttributes(); - } - set - { - //TODO: Implement + info.AddValue ("OriginalPath", OriginalPath, typeof(string)); + info.AddValue ("FullPath", FullPath, typeof(string)); + } + + #endregion Implementation of ISerializable +#endif + // public properties + + public abstract bool Exists { get; } + + public abstract string Name { get; } + + public virtual string FullName { + get { + return FullPath; } } - [MonoTODO] - public DateTime CreationTime - { - get - { - if(!inited) - { - update(); - } - // TODO: fix next line as far as my research has taken me so far, Unix/Linux don't - // have a creation time and according to my man the ctime if the last time - // one of the chmod flags was changed - return c2csharpTime(10);//status.st_ctime); - } - set - { - //TODO: Implement + public string Extension { + get { + return Path.GetExtension (Name); } } - public abstract bool Exists {get;} - public abstract string Name {get;} - public abstract void Delete(); + public FileAttributes Attributes { + get { + Refresh (false); + return stat.Attributes; + } - /// - /// Get the extension of this item - /// - public string Extension - { - get - { - return Path.GetExtension(getPathName()); + set { + MonoIOError error; + + if (!MonoIO.SetFileAttributes (FullName, + value, + out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); } } - public string FullName - { - get - { - return getPathName(); + public DateTime CreationTime { + get { + Refresh (false); + return DateTime.FromFileTime (stat.CreationTime); + } + + set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + + long filetime = value.ToFileTime (); + + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, filetime, + -1, -1, out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); } } - [MonoTODO] - public DateTime LastAccessTime - { - get - { - if(!inited) - { - update(); - } - return c2csharpTime(1);//status.st_atime); + [ComVisible(false)] + public DateTime CreationTimeUtc { + get { + return CreationTime.ToUniversalTime (); } - set - { - // TODO: Implement + set { + CreationTime = value.ToLocalTime (); } } - [MonoTODO] - public DateTime LastWriteTime - { // TODO: Implement - get - { - if(!inited) - { - update(); - } - return c2csharpTime(1);//status.st_mtime); + public DateTime LastAccessTime { + get { + Refresh (false); + return DateTime.FromFileTime (stat.LastAccessTime); } - set - { // TODO: Implement + + set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + + long filetime = value.ToFileTime (); + + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, -1, + filetime, -1, + out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); } } - public override int GetHashCode() - { - return getPathName().GetHashCode(); + [ComVisible(false)] + public DateTime LastAccessTimeUtc { + get { + Refresh (false); + return LastAccessTime.ToUniversalTime (); + } + + set { + LastAccessTime = value.ToLocalTime (); + } } - [MonoTODO] - public override bool Equals(object obj) - { // TODO: Implement - return false; + public DateTime LastWriteTime { + get { + Refresh (false); + return DateTime.FromFileTime (stat.LastWriteTime); + } + + set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + + long filetime = value.ToFileTime (); + + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, -1, -1, + filetime, out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); + } } - [MonoTODO] - new public static bool Equals(object obj1, object obj2) - { // TODO: Implement - return false; + [ComVisible(false)] + public DateTime LastWriteTimeUtc { + get { + Refresh (false); + return LastWriteTime.ToUniversalTime (); + } + + set { + LastWriteTime = value.ToLocalTime (); + } } - - public void Refresh() + + // public methods + + public abstract void Delete (); + + public void Refresh () { - update(); + Refresh (true); } - - unsafe private void update() + // protected + + protected FileSystemInfo () { - /* - stat fs; - int nRetCode = Wrapper.stat(getPathName(), &fs); - status = fs; - switch(nRetCode) - { - case 0: - break; - case Wrapper.ENOENT: - case Wrapper.ENOTDIR: - throw new ArgumentException("File not found"); - //break; generates warning CS0162 unreachable code - default: - throw new IOException(); - //break; generates warning CS0162 unreachable code - } - */ - inited = true; - } - - [MonoTODO] - private DateTime c2csharpTime(double seconds) - { // TODO: determine if UTC time which the - // calculation below is in is correct - DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0); - dt.AddSeconds(seconds); - return dt; + this.valid = false; + this.FullPath = null; } - - protected string getPathName() + + protected FileSystemInfo (SerializationInfo info, StreamingContext context) { - if(FullPath == String.Empty) + if (info == null) { - FullPath = Path.GetFullPath(OriginalPath); + throw new ArgumentNullException("info"); } - return FullPath; - } - [MonoTODO] - protected FileAttributes getAttributes() - { - if(!inited) - { - update(); - } + FullPath = info.GetString("FullPath"); + OriginalPath = info.GetString("OriginalPath"); + } + + protected string FullPath; + protected string OriginalPath; + + // internal + + internal void Refresh (bool force) + { + if (valid && !force) + return; + + MonoIOError error; - // TODO: lots more attribute work needed - - FileAttributes attrib = 0; - /* - if(((status.st_mode & Wrapper.S_IFMT) & Wrapper.S_IFDIR) != 0) - { - attrib |= FileAttributes.Directory; - } - else - { - attrib |= FileAttributes.Normal; - } - */ + MonoIO.GetFileStat (FullName, out stat, out error); + /* Don't throw on error here, too much other + * stuff relies on it not doing so... + */ + + valid = true; + + InternalRefresh (); + } + + internal virtual void InternalRefresh () + { + } - return attrib; + internal void CheckPath (string path) + { + if (path == null) + throw new ArgumentNullException ("path"); + if (path.Length == 0) + throw new ArgumentException ("An empty file name is not valid."); + if (path.IndexOfAny (Path.InvalidPathChars) != -1) + throw new ArgumentException ("Illegal characters in path."); + if (Environment.IsRunningOnWindows) { + int idx = path.IndexOf (':'); + if (idx >= 0 && idx != 1) + throw new ArgumentException ("path"); + } } + + internal MonoIOStat stat; + internal bool valid; } }