我有这个程序但是当我尝试访问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;
}
}
}
答案 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:的驱动器,很多机器也会报告它。