Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему `GetFileSizeEx()` выдает ошибку "Недействительный дескриптор файла" с файлами только для чтения и как это исправить

Delphi , Синтаксис , Справочник по API-функциям

Почему 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:01:41/0.0036318302154541/0