Как проверить, спит ли диск?

133
09 декабря 2019, 10:30

Если в Windows включено автоматическое отключение дисков при неактивности, то как программно проверить, спит диск или включен, естественно, не разбудив его при этом?

Answer 1

Вот таким способом удалось проверить PowerState диска и не разбудить его при этом. Моя домашняя система очень тихая, запуск и остановка диска отчетливо слышны. Более весомое доказательство: при повторных запусках состояние не изменяется, в отличие от варианта с получением хендла от файла.

Правда не без ложки дегтя, требуются права администратора и нужно знать порядковый номер проверяемого физического диска в системе.

99% кода примеры с PInvoke, моя только компоновка в рабочий вариант.

void Main()
{
    String status = String.Empty;
    bool fOn = false;
    var driveX = 1;
    var hFile = CreateFileW($@"\\.\PHYSICALDRIVE{driveX}", FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Offline, IntPtr.Zero);
    bool result = GetDevicePowerState(hFile, out fOn);
    if (result)
    {
        if (fOn)
        {
            status = "Disk is powered up and spinning";
        }
        else
        {
            status = "Disk is sleeping";
        }
    }
    else
    {
        status = "Cannot get Disk Status";
    }
    Console.WriteLine(status);
}
//https://www.pinvoke.net/default.aspx/kernel32.CreateFile
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr CreateFileW(
     [MarshalAs(UnmanagedType.LPWStr)] string filename,
     [MarshalAs(UnmanagedType.U4)] FileAccess access,
     [MarshalAs(UnmanagedType.U4)] FileShare share,
     IntPtr securityAttributes,
     [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
     [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
     IntPtr templateFile);
//https://www.pinvoke.net/default.aspx/kernel32.GetDevicePowerState
[DllImport("kernel32.dll")]
static extern bool GetDevicePowerState(IntPtr hDevice, out bool pfOn);

Ограничения:

  • системный диск спит только когда спит вся система (во всяком случае на Windows).
  • проверка не имеет смысла, если физический диск в системе единственный, он в любом случае будет активен, если вся система не спит (см. выше).
  • не уверен насчет SSD и прочих сменных носителей, проверять было не на чем, на единственном SDD живет система и он никогда не спит.
Answer 2

Можно подумать в сторону командной строки, что то вроде

Answer 3

Никак. За остановку диска при отсутствии обращений к нему отвечает прошивка диска. Винда может остановить диск только когда за компом никто не работает.

READ ALSO
Как запустить js по событию?

Как запустить js по событию?

Пытаюсь сделать, чтобы при заполнении формы и нажатии кнопки, форма записывалась в базу, и в случае успеха на экран выводилось всплывающее...

117
Как сериализовать кастомный SOAP для OTRS

Как сериализовать кастомный SOAP для OTRS

есть WSDL схема для SOAP в OTRS, к сожалению автоматом (подключением ссылок), не получается, потому как шарп считает файл не корректнымдля нормальной...

124
JavaScript. Создание файла

JavaScript. Создание файла

Всем приветПишу на Vue

107