Почему GetFileSizeEx() выдает ошибку "Недействительный дескриптор файла" с файлами только для чтения и как это исправить
При работе с функциями операционной системы Windows, разработчики могут столкнуться с различными ошибками, в том числе и с ошибкой "Недействительный дескриптор файла" при использовании функции GetFileSizeEx() для файлов, помеченных как только для чтения. В данной статье мы рассмотрим эту проблему на примере приложения на Delphi 6 и предложим решение.
Описание проблемы
При вызове функции GetFileSizeEx() из приложения на Delphi 6 для файла, который имеет атрибут только для чтения, может возникнуть ошибка операционной системы с кодом 6, что указывает на "Недействительный дескриптор файла". Это происходит из-за того, что функция GetFileSizeEx() требует наличия открытого файлового дескриптора, который не может быть получен для файлов с установленным атрибутом только для чтения без явной попытки открыть файл с соответствующими разрешениями.
Пример кода
function GetFileSizeEx(hFile: THandle; var FileSize: Int64): BOOL; stdcall; external 'kernel32.dll' name 'GetFileSizeEx';
function EasyGetFileSize(theFileHandle: THandle): Int64;
begin
if not GetFileSizeEx(theFileHandle, Result) then
RaiseLastOSError;
end;
Подтвержденное решение
Для корректной работы с функцией GetFileSizeEx() необходимо сначала открыть файл с разрешениями на чтение. Это можно сделать с помощью функции CreateFile, указав соответствующие параметры.
Альтернативное решение
В качестве альтернативы можно использовать функцию GetFileAttributesEx(), которая позволяет получить информацию о файле, включая его размер, без необходимости открытия файла.
function GetFileSize_(const sFilename: string): Int64; { NOT TESTED }
var
aHandle: THandle;
begin
aHandle := CreateFile(PChar(sFilename), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if aHandle = INVALID_HANDLE_VALUE then
Result := -1
else
begin
GetFileSizeEx(aHandle, Result);
CloseHandle(aHandle);
end;
end;
Комментарии к альтернативному решению
В примере выше используется создание файлового дескриптора для открытия файла в режиме чтения. После получения размера файла, дескриптор необходимо закрыть функцией CloseHandle. Также стоит рассмотреть вариант использования функции FindFirstFile() или GetFileAttributesEx(), которые позволяют получить размер файла без его открытия.
Рекомендации
При работе с файлами в Delphi и использовании функций Windows API важно помнить о правилах доступа к файлам и корректной обработке дескрипторов файлов. Всегда проверяйте результат открытия файла и корректно закрывайте дескрипторы после их использования.
Следуя этим рекомендациям, вы сможете избежать ошибок, связанных с недействительными дескрипторами файлов, и обеспечить надежность и эффективность вашего кода на Delphi.
При вызове функции `GetFileSizeEx()` в Delphi 6 для файла с атрибутом только для чтения возникает ошибка 'Недействительный дескриптор файла', что требует открытия файла с разрешениями на чтение перед использованием этой функции.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.