Учитывая, что у меня есть список всех файловых дескрипторов всех процессов, как я могу узнать, какие из этих дескрипторов фактически блокируют файл?
Из того, что я понимаю, я мог бы просто попытаться открыть файлы и попытаться получить все разрешения, и если что-то пойдет не так, я знаю, что оно заблокировано. Но это звучит крайне неэффективно. Я имею в виду, что у меня уже есть дескрипторы. Нет ли способа проверить, какие разрешения у дескрипторов?
Желательно, чтобы я увидел решение, которое работает на Windows XP и выше.
Я уже искал через GetFileInformationByHandleEx функция, но я не мог найти что-нибудь о правах доступа. : /
Редактировать:
Мне не нужна информация в режиме реального времени о блокировке файла. Файлы, над которыми я планирую работать, будут либо заблокированы до тех пор, пока определенные приложения не будут закрыты, либо не будут заблокированы вообще.
Этот вопрос является дубликатом Win32 файлы заблокированы для чтения: как узнать, кто их блокирует.
Кроме того, комментарий Ханса Пассанта правильный: запрос заблокированного состояния любого файла Win32 дает устаревшую информацию. Пренебрежение этим предупреждением приведет к появлению труднодоступных ошибок.
Если вы контролируете все фрагменты кода, которые, по вашему мнению, будут обращаться к файлам, лучше использовать именованная труба для межпроцессного взаимодействия, вместо запроса заблокированных файлов.
Ты можешь использовать NtQueryObject API для получения информации о дескрипторе, включая следующее:
ULONG Attributes;
ACCESS_MASK GrantedAccess;
Или вы можете получить доступ к той же информации, используя NtQueryInformationFile с помощью FileModeInformation
а также FileAccessInformation
значения для FileInformationClass
параметр.