Могу ли я программно узнать, используется ли диск?

Есть ли способ программно узнать, используется ли подключенный диск в настоящее время? Если я попытаюсь размонтировать диск с net use, и диск используется, он сообщит мне, что диск используется, и предложит мне предпринять дальнейшие действия.

Я хотел бы иметь возможность автоматически отключать диск, если он больше не используется. Система Windows XP.

2 ответа

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

Это много низкоуровневых Win32 API (NtQuerySystemInformation, NtQueryInformationFile, NtQueryObject и т. Д.), Но это определенно выполнимо. Если вы идете по этому пути, я бы порекомендовал взять копию Windows Internals, а также просмотреть MSDN и блог Марка Руссиновича.

Я не думаю, что это тот тип вещей, на который вы получите полный ответ здесь, если, возможно, не существует проекта с открытым исходным кодом, который уже делает это, с которым можно связать. Например, источник инструментов Sysinternals имел обыкновение быть в свободном доступе и все еще может быть найден, как эта версия v4.3x источника FileMon, которая может пролить некоторый свет.

Если это внутреннее приложение, то в качестве простого решения я бы предложил загрузить Handle приложение из Technet и выполнение из вашего процесса, а затем ваш процесс может прочитать результаты и отфильтровать по каждому диску, чтобы увидеть, есть ли какие-либо из них на диске, который вас интересует.

Обратите внимание, я не проверил, что условия лицензии для Handle на самом деле разрешает такое использование, но они появляются при первом запуске, так что вы можете проверить их потом.

Другие вопросы по тегам