X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FDriveInfo.cs;h=6c4c7eee87ce0b3a2563058aeed2b769b3bcff3c;hb=e2812813f9cd0a9342982f42f8b8b9818132a7fb;hp=d36f985ccad947b2081a2f09696e699a7423e853;hpb=0204abe80374a7f021d91a7c226ef07587195c8a;p=mono.git diff --git a/mcs/class/corlib/System.IO/DriveInfo.cs b/mcs/class/corlib/System.IO/DriveInfo.cs index d36f985ccad..6c4c7eee87c 100644 --- a/mcs/class/corlib/System.IO/DriveInfo.cs +++ b/mcs/class/corlib/System.IO/DriveInfo.cs @@ -22,7 +22,7 @@ // using System; -using System.Collections; +using System.Collections.Generic; using System.Text; using System.Runtime.Serialization; using System.Runtime.CompilerServices; @@ -32,21 +32,29 @@ namespace System.IO { [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; @@ -58,12 +66,6 @@ namespace System.IO { 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; @@ -107,10 +109,7 @@ namespace System.IO { [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 (); @@ -144,91 +143,20 @@ namespace System.IO { [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) @@ -248,5 +176,8 @@ namespace System.IO { [MethodImplAttribute (MethodImplOptions.InternalCall)] extern static uint GetDriveTypeInternal (string rootPathName); + + [MethodImplAttribute (MethodImplOptions.InternalCall)] + extern static string GetDriveFormat (string rootPathName); } }