为什么使用标记为只读的文件的GetFileSizeEx()会出现“无效句柄”错误?

时间:2011-05-20 02:32:51

标签: windows delphi winapi file handle

当我使用Windows API从我的Delphi 6应用程序上的只读文件调用GetFileSizeEx()时,我得到一个O / S错误代码6(“无效的文件句柄”)。如果从文件中删除只读属性,则错误消失。为什么我会收到该错误,是否有办法使用该调用或类似的只读文件?

以下是相关代码:

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;

- roschler

2 个答案:

答案 0 :(得分:6)

您是否检查了打开文件以获取文件句柄的结果?显然,如果文件无法打开,则使用无效句柄调用GetFileSizeEx。您需要以只读模式打开文件。

答案 1 :(得分:0)

也许是这样的?

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);
   FileClose(aHandle);
  end;
end;