Delphi FileSize ファイル名指定

function FileLen(const AFilename: WideString): Int64;
  var
    info: TWin32FileAttributeData;
begin
  Result := -1;

  if NOT GetFileAttributesExW(PWideChar(AFilename), GetFileExInfoStandard, @info) then
      EXIT;

  if (info.dwFileAttributes AND FILE_ATTRIBUTE_DIRECTORY > 0) then
      EXIT;
//    raise Exception.CreateFmt('Can not get file size : %s', [AFilename]);

  Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32);
end;

function FileSize(const AFilename: WideString): Int64;
begin
  Result := FileLen(AFilename);
end;

標準の関数ではファイルハンドルが必要で、この関数は直接ファイル名を指定できます。
また、標準の関数では32ビット整数のため大きなサイズのファイルを正しく返せない不具合を起こしますがこの関数は64ビット整数で返します。
Unicodeファイル名対応です。 AnsiString,stringをいれても自動型変換が行われるので、SHIFT_JISファイル名でも動作します。

戻り値:
成功した場合は 0以上
失敗した場合は -1
の値が返ってきます