我有这个程序,但是当我尝试访问第一个时,我有一个问题,如果...我需要分开驱动程序,并且只能获得C:的总大小。当程序停止时...说驱动器尚未准备就绪。我该怎么办?
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;
}
}
}
看来您应该在检查drive.VolumeLabel
之前测试drive.IsReady
。
看一下MSDN样本。
尝试以下操作:
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
直到准备就绪可能不是一个好主意。
问题不清楚。通过代码,这是旋转/等待可能是最佳选择的罕见情况之一。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
。
我似乎记得这是试图访问没有磁盘的'a:'的一个问题。即使您实际上没有驱动器,许多机器都会在那里报告。