function GetFileSizeEx(hFile: THandle; var lpFileSize: LARGE_INTEGER): BOOL; stdcall; external kernel32 name 'GetFileSizeEx'; function GetFileSize(const Filename: String; var FileSize: Int64): Boolean; var Handle: THandle; LI: LARGE_INTEGER; begin Result := False; FileSize := 0; Handle := Windows.CreateFile(PChar(Filename),GENERIC_READ,0,nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if Handle = INVALID_HANDLE_VALUE then begin Exit; end; try if GetFileSizeEx(Handle,LI) = False then begin Exit; end; finally Windows.CloseHandle(Handle); end; FileSize := LI.LowPart or (Int64(LI.HighPart) shl 32); Result := True; end;
GetFileSizeExがオープン済のファイルハンドルを要求するため、CreateFileで一旦ファイルをオープンし、ファイルサイズ取得後にクローズするようにしています。このためアクセス権などの問題からオープンに失敗するようなファイルのサイズを取得することができません。
0 件のコメント:
コメントを投稿