Есть ли способ проверить, действителен ли дескриптор (файла)?

Есть ли способ проверить, действителен ли дескриптор, в моем случае возвращаемый CreateFile?

Проблема, с которой я сталкиваюсь, заключается в том, что допустимый дескриптор файла, возвращенный CreateFile (это не INVALID_HANDLE_VALUE), позже приводит к сбою WriteFile, и GetLastError утверждает, что это из-за недопустимого дескриптора.


person Mathias    schedule 05.01.2011    source источник
comment
Если это так, то какая-то другая часть кода должна закрыть дескриптор.   -  person Vikram.exe    schedule 05.01.2011
comment
Или какой-нибудь неприятный инструмент вроде Handle.exe от SysInternals.   -  person Hans Passant    schedule 05.01.2011


Ответы (6)


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

См.: Добавление точки наблюдения (нарушение при изменении переменной)

person Daniel Trebbien    schedule 05.01.2011

Ваша проблема, скорее всего, вызвана одной из двух вещей:

  • Вы можете закрыть дескриптор файла, тем не менее, вы все равно пытаетесь его использовать
  • Дескриптор файла перезаписывается из-за повреждения памяти

Как правило, рекомендуется назначать INVALID_HANDLE_VALUE каждому дескриптору, если он не должен содержать никакого допустимого значения дескриптора. Простыми словами — когда ваша переменная объявлена ​​— немедленно инициализируйте ее этим значением. А также запишите это значение в вашу переменную сразу после того, как вы закроете дескриптор файла.

Это даст вам указание (1) - попытка использовать дескриптор файла, который уже закрыт (или еще не был открыт)

person valdo    schedule 05.01.2011

Все остальные ответы важны для вашей конкретной проблемы.

Однако, если вы получили HANDLE и просто хотите узнать, действительно ли это дескриптор открытого файла (в отличие, например, от дескриптора мьютекса или объекта GDI и т. д.), есть функция Windows API GetFileInformationByHandle.

В зависимости от разрешений, которые ваш дескриптор предоставляет вам для файла, вы также можете попытаться прочитать некоторые данные из него, используя ReadFile или выполнить нулевую операцию записи с помощью WriteFile с nNumberOfBytesToWrite равным 0.

person Felix Dombek    schedule 13.03.2013

Open-File хранится как структура данных в ядре, я не думаю, что есть официальный способ определить дескриптор файла, просто используйте его и проверьте код ошибки как INVALID_HANDLE. Вы уверены, что ни один другой поток не закрыл этот дескриптор файла?

person secmask    schedule 05.01.2011

Проверка валидности дескриптора в лучшем случае является временной повязкой.

Вы должны отладить процесс - установите точку останова в момент установки дескриптора (файл открыт), и когда вы нажмете этот код и после того, как дескриптор настроен, установите второй условная точка останова для срабатывания при изменении значения дескриптора.

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

person Steve Townsend    schedule 05.01.2011
comment
Для этого запроса есть очень правильный вариант использования. Например, дескриптор файла может стать недействительным из-за отказа кластера или, по старинке, сервер вышел из строя. - person Stephane; 08.07.2019

Просто чтобы добавить к тому, что говорят все остальные, убедитесь, что вы проверяете возвращаемое значение при вызове CreateFile. IIRC, он вернет INVALID_HANDLE_VALUE в случае сбоя, и в этот момент вы должны позвонить GetLastError, чтобы узнать, почему.

person Mike Caron    schedule 05.01.2011