Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

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

#c_sharp #c++ #windows #winapi #bat


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


Ответы

Ответ 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 живет система и он никогда не спит.

Ответ 2



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

Ответ 3



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

Комментариев нет:

Отправить комментарий