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で一旦ファイルをオープンし、ファイルサイズ取得後にクローズするようにしています。このためアクセス権などの問題からオープンに失敗するようなファイルのサイズを取得することができません。
2008年12月16日
ファイルサイズを取得する(2)
前回のファイルサイズの取得の方法ではNTFSログファイルが一杯になると取得できるファイルサイズがファイルの更新に従って変化しなくなるという不具合を避けることができません。そこでこのKBのworkaroundに従ってWin32APIのGetFileSizeExを使用してファイルサイズを取得する方法です。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿