如何将C:\驱动器与所有驱动程序分开?

时间:2014-03-06 20:47:19

标签: c# visual-studio-2010 drives

我有这个程序但是当我尝试访问FIRST时遇到问题...如果......我需要分离驱动程序并且只获得C:\的总大小。当程序停在if ...说驱动器没有准备好。我该怎么办?

class Program
{
    static void Main(string[] args)
    {
        string mainHD = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));

        GetTotalFreeSpace(mainHD);

        DriveInfo[] drives = DriveInfo.GetDrives();
        foreach (DriveInfo drive in drives)
        {
            if (drive.VolumeLabel != @"C:\")
            {
                //There are more attributes you can use.
                //Check the MSDN link for a complete example.
                string drivesname = drive.Name;
                Console.WriteLine(drivesname);
                if (drive.IsReady) Console.WriteLine(drive.TotalSize);
            }
        }
        Console.ReadLine();
    }

    private static long GetTotalFreeSpace(string driveName)
    {
        foreach (DriveInfo drive in DriveInfo.GetDrives())
        {
            if (drive.IsReady && drive.Name == driveName)
            {
                return drive.TotalSize;
            }
        }
        return -1;
    }
}
}

3 个答案:

答案 0 :(得分:1)

问题不明确。按照代码来看,这是极少数情况下旋转/等待可能是最佳选择之一。有两个Drive.IsReady的调用,它们都可以从旋转/等待中受益。后者可以像......那样完成。

private static long GetTotalFreeSpace(string driveName)
    {
        foreach (DriveInfo drive in DriveInfo.GetDrives())
        {
            if(!Drive.IsReady)
                //spin wait implemented however you deem appropriate.  Maybe sleep a second or so
            if (drive.Name == driveName)
            {
                return drive.TotalSize;
            }
        }
        return -1;
    }

其次,根据MSDN:

  

IsReady指示驱动器是否准备就绪。例如,它表明   CD是否在CD驱动器中,或者是否是可移动存储设备   准备进行读/写操作。如果您不测试驱动器是否   准备就绪,并没有准备好,使用DriveInfo查询驱动器   引发IOException。

我建议您添加一些逻辑来处理IOException

答案 1 :(得分:1)

在检查drive.IsReady之前,您似乎应该测试drive.VolumeLabel

查看MSDN sample

试试这个:

foreach (DriveInfo drive in drives)
{
    if (drive.IsReady && drive.VolumeLabel != @"C:\")
    {
        //There are more attributes you can use.
        //Check the MSDN link for a complete example.
        string drivesname = drive.Name;
        Console.WriteLine(drivesname);
        Console.WriteLine(drive.TotalSize);
    }
}

虽然这可能是C:驱动器未准备好的问题,但也可能是存在A:或B:软盘驱动器的情况,在这种情况下,继续检查IsReady直到它准备就绪可能不是一个好主意。

答案 2 :(得分:0)

我似乎记得这是尝试访问没有磁盘的'A:'驱动器的问题。即使你实际上没有A:的驱动器,很多机器也会报告它。