//
using System;
-using System.Collections;
+using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.CompilerServices;
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class DriveInfo : ISerializable {
- _DriveType _drive_type;
string drive_format;
string path;
- DriveInfo (_DriveType _drive_type, string path, string fstype)
+ DriveInfo (string path, string fstype)
{
- this._drive_type = _drive_type;
this.drive_format = fstype;
this.path = path;
}
public DriveInfo (string driveName)
{
- DriveInfo [] drives = GetDrives ();
+ if (!Environment.IsUnix) {
+ if (driveName == null || driveName.Length == 0)
+ throw new ArgumentException ("The drive name is null or empty", "driveName");
+
+ if (driveName.Length >= 2 && driveName [1] != ':')
+ throw new ArgumentException ("Invalid drive name", "driveName");
+
+ // Convert the path to a standard format so we can find it later.
+ driveName = String.Concat (Char.ToUpperInvariant (driveName [0]).ToString (), ":\\");
+ }
+ DriveInfo [] drives = GetDrives ();
foreach (DriveInfo d in drives){
if (d.path == driveName){
this.path = d.path;
throw new ArgumentException ("The drive name does not exist", "driveName");
}
- enum _DriveType {
- GenericUnix,
- Linux,
- Windows,
- }
-
static void GetDiskFreeSpace (string path, out ulong availableFreeSpace, out ulong totalSize, out ulong totalFreeSpace)
{
MonoIOError error;
[MonoTODO ("Currently get only works on Mono/Unix; set not implemented")]
public string VolumeLabel {
get {
- if (_drive_type != _DriveType.Windows)
- return path;
- else
- return path;
+ return path;
}
set {
throw new NotImplementedException ();
[MonoTODO("It always returns true")]
public bool IsReady {
get {
- if (_drive_type != _DriveType.Windows)
- return true;
-
- // Do something for Windows here.
return true;
}
}
- static StreamReader TryOpen (string name)
- {
- if (File.Exists (name))
- return new StreamReader (name, Encoding.ASCII);
- return null;
- }
-
- static DriveInfo [] LinuxGetDrives ()
- {
- using (StreamReader mounts = TryOpen ("/proc/mounts")){
- ArrayList drives = new ArrayList ();
- string line;
-
- while ((line = mounts.ReadLine ()) != null){
- if (line.StartsWith ("rootfs"))
- continue;
- int p;
-
- p = line.IndexOf (' ');
- if (p == -1)
- continue;
- string rest = line.Substring (p+1);
- p = rest.IndexOf (' ');
- if (p == -1)
- continue;
- string path = rest.Substring (0, p);
- rest = rest.Substring (p+1);
- p = rest.IndexOf (' ');
- if (p == -1)
- continue;
- string fstype = rest.Substring (0, p);
- drives.Add (new DriveInfo (_DriveType.Linux, path, fstype));
- }
-
- return (DriveInfo []) drives.ToArray (typeof (DriveInfo));
- }
- }
-
- static DriveInfo [] UnixGetDrives ()
- {
- DriveInfo [] di = null;
-
- try {
- using (StreamReader linux_ostype = TryOpen ("/proc/sys/kernel/ostype")){
- if (linux_ostype != null){
- string line = linux_ostype.ReadLine ();
- if (line == "Linux")
- di = LinuxGetDrives ();
- }
- }
-
- if (di != null)
- return di;
- } catch (Exception) {
- // If anything happens.
- }
-
- DriveInfo [] unknown = new DriveInfo [1];
- unknown [0]= new DriveInfo (_DriveType.GenericUnix, "/", "unixfs");
-
- return unknown;
- }
-
- static DriveInfo [] WindowsGetDrives ()
- {
- throw new NotImplementedException ();
- }
-
- [MonoTODO("Currently only implemented on Mono/Linux")]
+ [MonoTODO("In windows, alldrives are 'Fixed'")]
public static DriveInfo[] GetDrives ()
{
- int platform = (int) Environment.Platform;
+ var drives = Environment.GetLogicalDrives ();
+ DriveInfo [] infos = new DriveInfo [drives.Length];
+ int i = 0;
+ foreach (string s in drives)
+ infos [i++] = new DriveInfo (s, GetDriveFormat (s));
- if (platform == 4 || platform == 128 || platform == 6)
- return UnixGetDrives ();
- else
- return WindowsGetDrives ();
+ return infos;
}
void ISerializable.GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static uint GetDriveTypeInternal (string rootPathName);
+
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ extern static string GetDriveFormat (string rootPathName);
}
}