Получение байтов на сектор с использованием WMI на C#, зная только букву раздела ⇐ C#
-
Anonymous
Получение байтов на сектор с использованием WMI на C#, зная только букву раздела
Для моего приложения мне нужно определить лучший диск/раздел. Требования следующие:
[*]20 ГБ или более бесплатно [*]Диск должен быть зафиксирован (например, он не должен быть съемным USB-накопителем и т. д.) [*]Базовый диск должен иметь значение BytesPerSector 512 ИЛИ 4096.
Точки 1 и 2 можно легко проанализировать с помощью класса DriveInfo на C#. Однако я застрял на пункте 3...
Получение значения BytesPerSector из класса Win32_DiskDrive осуществляется с помощью ManagementObjectSearch. Однако я не могу проанализировать конкретный диск.
Например. Допустим, я хочу найти значение BytesPerSector C:\
// Указываем букву диска (изменяем на нужную букву) строкаdriveLetter = "C:"; // Получаем информацию о диске для указанной буквы диска DriveInfodriveInfo = новый (driveLetter); // Проверяем, готов ли диск (смонтирован) Assert.IsTrue(driveInfo.IsReady, $"Ожидали, что диск будет готов, но это не так"); Console.WriteLine("Формат: " + DriveInfo.Name); // Получаем диск, связанный с разделом вар diskDrive = новый System.Management.ManagementObjectSearcher( "SELECT * FROM Win32_DiskDrive WHERE DeviceID = '" +driveInfo.Name + "'" ).Get().OfType().FirstOrDefault(); // Проверяем, найден ли диск Assert.IsNotNull(diskDrive, $"Ожидался, что диск найден, но его значение равно нулю"); // Получаем информацию BytesPerSector uint bytesPerSector = Convert.ToUInt32(diskDrive["BytesPerSector"]); // Распечатываем информацию BytesPerSector Assert.IsTrue(bytesPerSector == 512 || bytesPerSector == 4096, $"Ожидали 512 или 4096, но было {bytesPerSector}"); Это не удается, за исключением:
Сообщение: Метод тестирования TestSectorInfo выдал исключение: System.Management.ManagementException: неверный запрос
Некоторые поиски привели меня к открытию, что DeviceID, ожидаемый Win32_DiskDrive, выглядит так:
\\.\PHYSICALDRIVE0 \\.\PHYSICALDRIVE1 и т. д.
Но я не могу знать наверняка, находится ли C:\ на DRIVE0 или DRIVE1, поэтому сначала мне нужно каким-то образом перевести букву раздела на соответствующий диск... Как мне вообще это сделать?
Я также пытался передать букву тома в запрос, но это не сработало, и искал классы C#, которые могли бы сделать то, что мне нужно, но безрезультатно.
Для моего приложения мне нужно определить лучший диск/раздел. Требования следующие:
[*]20 ГБ или более бесплатно [*]Диск должен быть зафиксирован (например, он не должен быть съемным USB-накопителем и т. д.) [*]Базовый диск должен иметь значение BytesPerSector 512 ИЛИ 4096.
Точки 1 и 2 можно легко проанализировать с помощью класса DriveInfo на C#. Однако я застрял на пункте 3...
Получение значения BytesPerSector из класса Win32_DiskDrive осуществляется с помощью ManagementObjectSearch. Однако я не могу проанализировать конкретный диск.
Например. Допустим, я хочу найти значение BytesPerSector C:\
// Указываем букву диска (изменяем на нужную букву) строкаdriveLetter = "C:"; // Получаем информацию о диске для указанной буквы диска DriveInfodriveInfo = новый (driveLetter); // Проверяем, готов ли диск (смонтирован) Assert.IsTrue(driveInfo.IsReady, $"Ожидали, что диск будет готов, но это не так"); Console.WriteLine("Формат: " + DriveInfo.Name); // Получаем диск, связанный с разделом вар diskDrive = новый System.Management.ManagementObjectSearcher( "SELECT * FROM Win32_DiskDrive WHERE DeviceID = '" +driveInfo.Name + "'" ).Get().OfType().FirstOrDefault(); // Проверяем, найден ли диск Assert.IsNotNull(diskDrive, $"Ожидался, что диск найден, но его значение равно нулю"); // Получаем информацию BytesPerSector uint bytesPerSector = Convert.ToUInt32(diskDrive["BytesPerSector"]); // Распечатываем информацию BytesPerSector Assert.IsTrue(bytesPerSector == 512 || bytesPerSector == 4096, $"Ожидали 512 или 4096, но было {bytesPerSector}"); Это не удается, за исключением:
Сообщение: Метод тестирования TestSectorInfo выдал исключение: System.Management.ManagementException: неверный запрос
Некоторые поиски привели меня к открытию, что DeviceID, ожидаемый Win32_DiskDrive, выглядит так:
\\.\PHYSICALDRIVE0 \\.\PHYSICALDRIVE1 и т. д.
Но я не могу знать наверняка, находится ли C:\ на DRIVE0 или DRIVE1, поэтому сначала мне нужно каким-то образом перевести букву раздела на соответствующий диск... Как мне вообще это сделать?
Я также пытался передать букву тома в запрос, но это не сработало, и искал классы C#, которые могли бы сделать то, что мне нужно, но безрезультатно.
Мобильная версия