a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
271 lines
6.2 KiB
C#
271 lines
6.2 KiB
C#
//------------------------------------------------------------------------------
|
|
//
|
|
// 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
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
|
|
//
|
|
// 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
|
|
|
|
[ComVisible(false)]
|
|
public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
|
|
{
|
|
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;
|
|
}
|
|
}
|
|
|
|
public string Extension {
|
|
get {
|
|
return Path.GetExtension (Name);
|
|
}
|
|
}
|
|
|
|
public FileAttributes Attributes {
|
|
get {
|
|
Refresh (false);
|
|
return stat.Attributes;
|
|
}
|
|
|
|
set {
|
|
MonoIOError error;
|
|
|
|
if (!MonoIO.SetFileAttributes (FullName,
|
|
value,
|
|
out error))
|
|
throw MonoIO.GetException (FullName,
|
|
error);
|
|
Refresh (true);
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
[ComVisible(false)]
|
|
public DateTime CreationTimeUtc {
|
|
get {
|
|
return CreationTime.ToUniversalTime ();
|
|
}
|
|
|
|
set {
|
|
CreationTime = value.ToLocalTime ();
|
|
}
|
|
}
|
|
|
|
public DateTime LastAccessTime {
|
|
get {
|
|
Refresh (false);
|
|
return DateTime.FromFileTime (stat.LastAccessTime);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
[ComVisible(false)]
|
|
public DateTime LastAccessTimeUtc {
|
|
get {
|
|
Refresh (false);
|
|
return LastAccessTime.ToUniversalTime ();
|
|
}
|
|
|
|
set {
|
|
LastAccessTime = value.ToLocalTime ();
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
[ComVisible(false)]
|
|
public DateTime LastWriteTimeUtc {
|
|
get {
|
|
Refresh (false);
|
|
return LastWriteTime.ToUniversalTime ();
|
|
}
|
|
|
|
set {
|
|
LastWriteTime = value.ToLocalTime ();
|
|
}
|
|
}
|
|
|
|
// public methods
|
|
|
|
public abstract void Delete ();
|
|
|
|
public void Refresh ()
|
|
{
|
|
Refresh (true);
|
|
}
|
|
|
|
// protected
|
|
|
|
protected FileSystemInfo ()
|
|
{
|
|
this.valid = false;
|
|
this.FullPath = null;
|
|
}
|
|
|
|
protected FileSystemInfo (SerializationInfo info, StreamingContext context)
|
|
{
|
|
if (info == null)
|
|
{
|
|
throw new ArgumentNullException("info");
|
|
}
|
|
|
|
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;
|
|
|
|
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 ()
|
|
{
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|