Как я могу обнаружить, если жесткий диск вращается (под Windows)? -- windows поле с участием winapi поле с участием hard-drive пол Связанный проблема

How can I detect if a hard drive is spinning (under Windows)?


9
vote

проблема

русский

Как я могу программически определить, в настоящее время жесткий диск в настоящее время вращается или нет (Windows 7 или более поздней версии)?

Я попробовал <код> GetDevicePowerState() , но он всегда возвращает <код> TRUE (всегда 1, не другое ненулевое значение) для приводов, которые я знаю, в настоящее время не вращается (как для внутреннего, так и для внутреннего, так и для внутреннего USB-накопители). Сразу после GetDevicePowerState() возвращает <код> TRUE , если я выдачу <код> dir d: в консоли, я слышу дисковый раскрутку, и есть задержка несколько секунд до Список каталогов генерируется.

Мой код должен проверить, существует ли каталог на диске. Проверка может быть отложена или пропущена, если привод в настоящее время скрывается. Я хочу избежать проверки проверки на Down Down Drive по 2 причинам: 1) Проверка в данный момент выполняется синхронно, и я не хочу, чтобы пользователю приходилось дождаться диска, чтобы вращаться 2), я не хочу заставить диск вращаться, просто чтобы сделать мою чек (надеюсь, это очевидно, почему бы не).

Есть ли способ сделать это?

Обновление на основе комментариев:

Было предложено, чтобы <Код> public class BranchListAdapter extends ArrayAdapter<HashMap<String, String>> { private Context mContext; private LayoutInflater mLayoutInflater; public BranchListAdapter(Context context) { super(context, android.R.layout.simple_list_item_1); mContext = context; mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view; if(convertView == null) { view = mLayoutInflater.inflate(R.layout.fragment_shop_details_branch_list_item, parent, false); } else { view = convertView; } final HashMap<String, String> branch = getItem(position); TextView address = (TextView) view.findViewById(R.id.branch_list_item_address); TextView city = (TextView) view.findViewById(R.id.branch_list_item_city); TextView phone = (TextView) view.findViewById(R.id.branch_list_item_phone); address.setText(branch.get("address")); city.setText(branch.get("city")); phone.setText(branch.get("phone")); return view; } public void setData(List<HashMap<String, String>> branches) { clear(); if(branches != null) { for(HashMap<String, String> branch : branches) { if(!branch.get("address").equals("")) add(branch); } } } } 0 работает с именами физических устройств, но я не могу получить его, чтобы вернуть ничего, кроме 1 (опять же, для дисков, которые я проверил, не вращается). Ниже приведен код, который я использую. Если <код> public class BranchListAdapter extends ArrayAdapter<HashMap<String, String>> { private Context mContext; private LayoutInflater mLayoutInflater; public BranchListAdapter(Context context) { super(context, android.R.layout.simple_list_item_1); mContext = context; mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view; if(convertView == null) { view = mLayoutInflater.inflate(R.layout.fragment_shop_details_branch_list_item, parent, false); } else { view = convertView; } final HashMap<String, String> branch = getItem(position); TextView address = (TextView) view.findViewById(R.id.branch_list_item_address); TextView city = (TextView) view.findViewById(R.id.branch_list_item_city); TextView phone = (TextView) view.findViewById(R.id.branch_list_item_phone); address.setText(branch.get("address")); city.setText(branch.get("city")); phone.setText(branch.get("phone")); return view; } public void setData(List<HashMap<String, String>> branches) { clear(); if(branches != null) { for(HashMap<String, String> branch : branches) { if(!branch.get("address").equals("")) add(branch); } } } } 1 действительно знают работать с USB-накопителями, есть ли что-то не так с моими аргументами <код> public class BranchListAdapter extends ArrayAdapter<HashMap<String, String>> { private Context mContext; private LayoutInflater mLayoutInflater; public BranchListAdapter(Context context) { super(context, android.R.layout.simple_list_item_1); mContext = context; mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view; if(convertView == null) { view = mLayoutInflater.inflate(R.layout.fragment_shop_details_branch_list_item, parent, false); } else { view = convertView; } final HashMap<String, String> branch = getItem(position); TextView address = (TextView) view.findViewById(R.id.branch_list_item_address); TextView city = (TextView) view.findViewById(R.id.branch_list_item_city); TextView phone = (TextView) view.findViewById(R.id.branch_list_item_phone); address.setText(branch.get("address")); city.setText(branch.get("city")); phone.setText(branch.get("phone")); return view; } public void setData(List<HashMap<String, String>> branches) { clear(); if(branches != null) { for(HashMap<String, String> branch : branches) { if(!branch.get("address").equals("")) add(branch); } } } } 2 ?

 <код> public class BranchListAdapter extends ArrayAdapter<HashMap<String, String>> {  private Context mContext; private LayoutInflater mLayoutInflater;  public BranchListAdapter(Context context) {     super(context, android.R.layout.simple_list_item_1);     mContext = context;     mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }  @Override public View getView(int position, View convertView, ViewGroup parent) {     final View view;      if(convertView == null) {         view = mLayoutInflater.inflate(R.layout.fragment_shop_details_branch_list_item, parent, false);     } else {         view = convertView;     }      final HashMap<String, String> branch = getItem(position);      TextView address = (TextView) view.findViewById(R.id.branch_list_item_address);     TextView city = (TextView) view.findViewById(R.id.branch_list_item_city);     TextView phone = (TextView) view.findViewById(R.id.branch_list_item_phone);      address.setText(branch.get("address"));     city.setText(branch.get("city"));     phone.setText(branch.get("phone"));      return view; }  public void setData(List<HashMap<String, String>> branches) {     clear();     if(branches != null) {         for(HashMap<String, String> branch : branches) {             if(!branch.get("address").equals(""))                 add(branch);         }     } } } 3  
Английский оригинал

How can I programatically determine if a hard drive is currently spinning or not (Windows 7 or later)?

I tried GetDevicePowerState() but it always returns TRUE (always 1, not another non-zero value) for drives that I know are currently not spinning (for both internal and USB drives). Immediately after GetDevicePowerState() returns TRUE, if I issue dir d: in a console, I hear the drive spin up and there is a several-second delay before the directory listing is generated.

My code needs to check if a directory on a drive exists. The check can be deferred or skipped if the drive is currently spun down. I want to avoid making the check on a spun down drive for 2 reasons: 1) the check is currently done synchronously and I don't want the user to have to wait for the drive to spin up 2) I don't want to cause the drive to spin up just to make my check (hopefully it is obvious why not).

Is there a way to do this?

Update based on comments:

It was suggested that GetDevicePowerState works with physical device names but I cannot get it to return anything other than 1 (again, for drives that I have verified are NOT spinning). The following is the code I am using. If GetDevicePowerState is indeed known to work with USB drives, is there perhaps something wrong with my arguments to CreateFile?

for (int DriveNumber = 0; DriveNumber < 128; ++DriveNumber) {    TCHAR Drive[128];    _stprintf (Drive, _T("\\.\PHYSICALDRIVE%d"), DriveNumber);    HANDLE hDevice = CreateFile(Drive, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);    if (hDevice != INVALID_HANDLE_VALUE) {       BOOL DeviceIsOn = FALSE;       if (GetDevicePowerState(hDevice, &DeviceIsOn) != 0) {          _tprintf(_T("Physical Drive %d is Powered %s (DeviceIsOn=%d) "), DriveNumber, DeviceIsOn?_T("On"):_T("Off"), (int)DeviceIsOn);       }       CloseHandle(hDevice);    } } 
</div
        
       
       

Список ответов

1
 
vote

Как мне нравится говорить, не говори мне о ошибке - скажи мне о том, что вы пытаетесь сделать.

Мой код должен проверить, существует ли каталог на диске

ОК, если это конечная цель, Windows предоставляет API для того, что называется FindFirstChangeNotification. Вы можете использовать API изменить уведомления для раскрутки потока и монитора, когда файлы или каталоги меняются.

https: // msdn .microsoft.com / en-us / библиотека / windows / desktop / aa365261 (v = vs.85) .aspx

 

As I like to say, don't tell me about the bug - tell me about what you're trying to accomplish.

My code needs to check if a directory on a drive exists

OK, if that's the end goal, Windows provides an API for that called FindFirstChangeNotification. You can use the Change Notification APIs to spin up a thread and monitor when files or directories change.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx

</div
 
 

Связанный проблема

0  Новые и удаление контейнеров DLL  ( New and delete container dlls ) 
Я хочу зацепить новые и удалять операторы. Но я не могу найти оригинальные DLL, где проживают эти операторы. Я использовал msvcr90.dll, msvsr90d.dll, msvcrt.d...

98  Подключение к серверу Microsoft SQL с помощью Python  ( Connecting to microsoft sql server using python ) 
<Р> Я пытаюсь подключиться к SQL через питон для запуска некоторых запросов на некоторых базах данных SQL на сервере Microsoft SQL. Из моих исследований в Инте...

1  Извлечение определенного ключа реестра из Reg Query на основе строки поиска  ( Extracting specific registry key from reg query based on search string ) 
Я пытаюсь извлечь ключевое значение записи реестра. Я только хочу, чтобы ключ, который я пытался объединить, используя FOR /F , однако не повезло. , напр...

1  WINDBG, как установить точку останова метода на конкретный процесс  ( Windbg how to set method breakpoint on specific process ) 
У меня есть виртуальная машина с <Код> VirtualKD Драйверы, установленные и прикрепленные к WINGBG, работающим на хост-машина. До сих пор мне удалось устано...

10  Browsersync с аутентификацией Windows  ( Browsersync with windows authentication ) 
Я использую Browsersync в приложении .NET. У меня есть IIS, установленные только с аутентификацией Windows (анонимная аутентификация отключена). Я получаю 402...

2  Консоль Windows выводится из неразборчива WAIFU2X-Caffe  ( Windows console output from waifu2x caffe unintelligible ) 
Я использую WAIF2X, чтобы выработать серию изображений, но у меня проблема с командой, которую я бегу. Я бы попытался устранить неполадки сами, но я не могу и...

0  Я запускаю программу EXE из службы Windows, но я не вижу форму C #?  ( I run an exe program from a windows service but i cant see form c ) 
Я запускаю другую программу из службы Windows <код> private Process RunApp(string _appLocation) { //Create Process Process _ret = new Pr...

14  Как прочитать / написать машинный код .exe вручную?  ( How to read write exe machine code manually ) 
Я не очень хорошо знаком для магии компилятора. Акт преобразования читаемого человеком кода (или нечитаемых инструкций по читабельности ) в машинный код, для ...

0  Как я могу сделать макрос, чтобы запустить несколько команд PowerShell один за другим?  ( How can i make a macro to run a few powershell commands one after the other ) 
Я использую расширение PowerShell PowerShell Amazon Web Service. У меня есть несколько команд, которые я хочу бежать за помощью друг с другом: <код> PS C:g>...

0  Напишите программу, которая извлекает содержимое файла RPM в Windows  ( Write a program that extracts the contents of an rpm file on windows ) 
Я хочу написать программу, которая извлечет содержимое RPM-файла и выполняет некоторые проверки проверки. Я буду использовать Qt для интерфейса, чтобы програм...

0  Использование крепления связывания в Docker, чтобы иметь папку на хост-машине Windows, доступной для контейнера  ( Using a bind mount in docker to have a folder on windows host machine available ) 
Я пытаюсь получить настройку, где я могу развернуть контейнер Docker с приложением Java, установленным на нем, где приложение может записывать в папку в конте...

1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса?  ( Stop msvc debug errors from blocking the current process ) 
Любые неудачные утверждения Assert в Windows приводят к появлению подразделения ниже и замораживают выполнение приложений. Я понимаю, что это ожидаемое поведе...

35  Какие Windows SVN сервер должен использовать? [закрыто]  ( Which windows svn server should i use ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос находится на основе мнения . В настоящее вре...

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows?  ( How to invoke my restful api method integrated with redis on windows ) 
Я пытаюсь запустить образец весеннего загрузочного приложения с Redis. Я использую завод соединения JEDIS и установив его на заводе подключения шаблона Redis....

4  Программирование Windows GUI - C + SDK или C # + Windows Forms  ( Windows gui programming c sdk or c sharp windows forms ) 
Я программистом с большим количеством опыта кода сервера (AIX, HPUX, какой-то Linux) Мне нужно для написания программы GUI для Windows (2000, XP, Vista, 7), к...

Связанный проблема

0  Новые и удаление контейнеров DLL 
98  Подключение к серверу Microsoft SQL с помощью Python 
1  Извлечение определенного ключа реестра из Reg Query на основе строки поиска 
1  WINDBG, как установить точку останова метода на конкретный процесс 
10  Browsersync с аутентификацией Windows 
2  Консоль Windows выводится из неразборчива WAIFU2X-Caffe 
0  Я запускаю программу EXE из службы Windows, но я не вижу форму C #? 
14  Как прочитать / написать машинный код .exe вручную? 
0  Как я могу сделать макрос, чтобы запустить несколько команд PowerShell один за другим? 
0  Напишите программу, которая извлекает содержимое файла RPM в Windows 
0  Использование крепления связывания в Docker, чтобы иметь папку на хост-машине Windows, доступной для контейнера 
1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса? 
35  Какие Windows SVN сервер должен использовать? [закрыто] 
1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows? 
4  Программирование Windows GUI - C + SDK или C # + Windows Forms