Я знаю, что есть много способов выполнить то, что я пытаюсь сделать здесь, но я хотел попробовать это с LINQ, и вижу некоторые странные (для меня) результаты. Надеюсь, у кого-то есть мудрость, чтобы предложить мне.
Цель - найти диск на локальном компьютере, на котором мы выполняем, с максимально доступным свободным пространством, отформатированным в файловой системе NTFS, за исключением тома% SystemDrive%, если это возможно. Еще одна оговорка: диски, которым назначена буква тома, но которые еще не отформатированы, должны быть исключены из пула кандидатов. Это крайний случай, но один клиент уже столкнулся с ним.
Итак, я пытаюсь:
string systemDrive = Environment.GetEnvironmentVariable("SystemDrive") + "\\";
List<DriveInfo> localDrives = DriveInfo.GetDrives().ToList();
var bestAPIDataDrives = from localDrive in localDrives
orderby localDrive.AvailableFreeSpace descending
where localDrive.DriveType == DriveType.Fixed &&
localDrive.DriveFormat == "NTFS" &&
localDrive.RootDirectory.FullName != systemDrive &&
localDrive.IsReady
select localDrive.RootDirectory.FullName;
string path = String.Empty;
if (bestAPIDataDrives.Count() == 0)
{
// there is only a system drive available, use it anyway.
path = systemDrive;
}
else
{
path = bestAPIDataDrives.ElementAt(0).ToString();
}
Когда я получаю ссылку на bestAPIDataDrives.Count (), я получаю IOException со свойством Message, установленным на «Устройство не готово».
Я не понимаю, почему это происходит, потому что у меня есть тест localDrive.IsReady в запросе LINQ, или, по крайней мере, я так думаю.