using System.Collections;
using System.Text;
using System.Runtime.Serialization;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace System.IO {
[ComVisibleAttribute(true)]
public sealed class DriveInfo : ISerializable {
_DriveType _drive_type;
- DriveType drive_type;
string drive_format;
string path;
this._drive_type = _drive_type;
this.drive_format = fstype;
this.path = path;
-
- this.drive_type = ToDriveType (_drive_type, fstype);
}
public DriveInfo (string driveName)
foreach (DriveInfo d in drives){
if (d.path == driveName){
this.path = d.path;
- this.drive_type = d.drive_type;
this.drive_format = d.drive_format;
this.path = d.path;
- this._drive_type = d._drive_type;
return;
}
}
Linux,
Windows,
}
-
- [MonoTODO("Always returns infinite")]
+
+ static void GetDiskFreeSpace (string path, out ulong availableFreeSpace, out ulong totalSize, out ulong totalFreeSpace)
+ {
+ MonoIOError error;
+ if (!GetDiskFreeSpaceInternal (path, out availableFreeSpace, out totalSize, out totalFreeSpace, out error))
+ throw MonoIO.GetException (path, error);
+ }
+
public long AvailableFreeSpace {
get {
- if (DriveType == DriveType.CDRom || DriveType == DriveType.Ram || DriveType == DriveType.Unknown)
- return 0;
- return Int64.MaxValue;
+ ulong availableFreeSpace;
+ ulong totalSize;
+ ulong totalFreeSpace;
+
+ GetDiskFreeSpace (path, out availableFreeSpace, out totalSize, out totalFreeSpace);
+ return availableFreeSpace > long.MaxValue ? long.MaxValue : (long) availableFreeSpace;
}
}
- [MonoTODO("Always returns infinite")]
public long TotalFreeSpace {
get {
- if (DriveType == DriveType.CDRom || DriveType == DriveType.Ram || DriveType == DriveType.Unknown)
- return 0;
- return Int64.MaxValue;
+ ulong availableFreeSpace;
+ ulong totalSize;
+ ulong totalFreeSpace;
+
+ GetDiskFreeSpace (path, out availableFreeSpace, out totalSize, out totalFreeSpace);
+ return totalFreeSpace > long.MaxValue ? long.MaxValue : (long) totalFreeSpace;
}
}
- [MonoTODO("Always returns infinite")]
public long TotalSize {
get {
- return Int64.MaxValue;
+ ulong availableFreeSpace;
+ ulong totalSize;
+ ulong totalFreeSpace;
+
+ GetDiskFreeSpace (path, out availableFreeSpace, out totalSize, out totalFreeSpace);
+ return totalSize > long.MaxValue ? long.MaxValue : (long) totalSize;
}
}
}
}
- static DriveType ToDriveType (_DriveType drive_type, string drive_format)
- {
- if (drive_type == _DriveType.Linux){
- switch (drive_format){
- case "tmpfs":
- case "ramfs":
- return DriveType.Ram;
- case "iso9660":
- return DriveType.CDRom;
- case "ext2":
- case "ext3":
- case "sysv":
- case "reiserfs":
- case "ufs":
- case "vfat":
- case "udf":
- case "hfs":
- case "hpfs":
- case "qnx4":
- return DriveType.Fixed;
- case "smbfs":
- case "fuse":
- case "nfs":
- case "nfs4":
- case "cifs":
- case "ncpfs":
- case "coda":
- case "afs":
- return DriveType.Network;
- case "proc":
- case "sysfs":
- case "debugfs":
- case "devpts":
- case "securityfs":
- return DriveType.Ram;
- default:
- return DriveType.Unknown;
- }
- } else {
- return DriveType.Fixed;
- }
- }
-
public DriveType DriveType {
get {
- return drive_type;
+ return (DriveType) GetDriveTypeInternal (path);
}
}
{
return(Name);
}
+
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ extern static bool GetDiskFreeSpaceInternal (string pathName, out ulong freeBytesAvail,
+ out ulong totalNumberOfBytes, out ulong totalNumberOfFreeBytes,
+ out MonoIOError error);
+
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ extern static uint GetDriveTypeInternal (string rootPathName);
}
}