質問

Delphi 2010には、 IOUtils.pas に新しいファイルアクセス関数の素晴らしいセットがあります(特に日付関連関数のUTCバージョンが好きです)。私が今まで見逃していたのは次のようなものです

TFile.GetSize (const Path : String)

ファイルのサイズを取得するDelphi 2010の方法は何ですか? TSearchRec.FindData にアクセスするには、戻ってFindFirstを使用する必要がありますか?

ありがとう。

役に立ちましたか?

解決

" Delphi 2010"があるかどうかわかりません。方法ですが、FindFirstを含まない Windowsの方法がありますジャズすべて

このルーチンのDelphi変換をまとめました(そして、必要に応じて> 4GBサイズのファイルを処理するように修正しました)。

  uses
    WinApi.Windows;

  function FileSize(const aFilename: String): Int64;
  var
    info: TWin32FileAttributeData;
  begin
    result := -1;

    if NOT GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then
      EXIT;

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

実際には GetFileSize()を使用できますが、これにはファイル名だけでなくファイルハンドルが必要で、 GetCompressedFileSize()の提案と同様に、これには2つ必要です呼び出す変数。 GetFileSize() GetCompressedFileSize()の両方が戻り値をオーバーロードするため、成功のテストと有効な結果の確認はほんの少し厄介です。

GetFileSize Ex ()は、処理の核心を避けます> 4GBのファイルサイズと有効な結果を検出しますが、名前ではなくファイルハンドルも必要です(少なくともDelphi 2009の時点で、2010年はチェックしていません)VCLで宣言されていません独自のインポート宣言を提供します。

他のヒント

Indyユニットの使用:

uses IdGlobalProtocols;

function FileSizeByName(const AFilename: TIdFileName): Int64;

DSiWin32 からDSiFileSizeを使用することもできます。 「すべて」で動作します;デルファイ。内部的にはCreateFileとGetFileSizeを呼び出します。

function DSiFileSize(const fileName: string): int64;
  var
    fHandle: DWORD;
  begin
    fHandle := CreateFile(PChar(fileName), 0, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if fHandle = INVALID_HANDLE_VALUE then
      Result := -1
    else try
      Int64Rec(Result).Lo := GetFileSize(fHandle, @Int64Rec(Result).Hi);
    finally CloseHandle(fHandle); end;
  end; { DSiFileSize }

Pure Delphi のいくつかの方法について言及したいと思います。私は Deltics Windowsプラットフォームに対して最も速度効率の良い答えを作ったと思いますが、RTLに頼り、 Delphiで動作する移植可能なコードを作成したい場合もありますMacOSの場合または FreePascal / Virtual Pascal / whatever で。


Turbo Pascal時代には FileSize 関数が残っています。

上記のサンプルには「読み取り専用」がありません;モード設定。 ACLがr / oに設定されたCD-ROMメディアまたはフォルダー内のファイルなどのr / oファイルを開く必要があります。 ReSet を呼び出す前に、 FileMode グローバル変数にゼロを割り当てる必要があります。

2GBを超えるサイズのファイルでは機能しません(基本的なキャストに対してマイナスの場合-最大4GB)。 1つ。


もう1つのアプローチがあります。MS-DOS用にASMプログラミングを行ったことがある場合は、慣れているかもしれません。 Seek ファイルポインターを最初のバイトに移動し、最後のバイトに移動して、違いを確認します。
どのDelphiバージョンがそれらを導入したのか正確に言うことはできませんが、D5やD7のような古代のバージョンにすでにあったと思いますが、それは単なる常識であり、確認することはできません。
これにより、サイズが取得された後、常にハンドルを閉じるために、余分なTHandle変数と try-finally ブロックが必要になります。

最初のアプローチは別として、これはint64対応です。 FreePascalとの互換性もありますが、いくつかの制限があります


TFileStream 型のオブジェクトを作成して使用することもできます。これはプライマリであり、以来ファイル操作の場 Delphi 1.0

uses
  System.Classes, System.IOUtils;

function GetFileSize(const FileName : string) : Int64;
var
  Reader: TFileStream;
begin
  Reader := TFile.OpenRead(FileName);
  try
    result := Reader.Size;
  finally
    Reader.Free;
  end;
end;

これは、ジョブを実行するファイルサイズを使用した短いソリューションです。

function GetFileSize(p_sFilePath : string) : Int64;
var
  oFile : file of Byte;
begin
  Result := -1;
  AssignFile(oFile, p_sFilePath);
  try
    Reset(oFile);
    Result := FileSize(oFile);
  finally
    CloseFile(oFile);
  end;
end;

私が知っていることから、ファイルサイズはXE2からのみ利用可能です

scroll top