2008年12月16日

ファイルサイズを取得する(2)

前回のファイルサイズの取得の方法ではNTFSログファイルが一杯になると取得できるファイルサイズがファイルの更新に従って変化しなくなるという不具合を避けることができません。そこでこのKBのworkaroundに従ってWin32APIのGetFileSizeExを使用してファイルサイズを取得する方法です。
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 件のコメント: