33

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

TFile.GetSize (const Path : String)

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

ありがとう。

4

6 に答える 6

56

「Delphi2010」の方法があるかどうかはわかりませんが、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()を使用することもできます、これにはファイル名だけでなくファイルHANDLEが必要であり、GetCompressedFileSize()の提案と同様に、呼び出すには2つの変数が必要です。GetFileSize( )GetCompressedFileSize( )はどちらも戻り値をオーバーロードするため、成功のテストと有効な結果の確認は、少し厄介です。

GetFileSize Ex()は、4 GBを超えるファイルサイズを処理し、有効な結果を検出するという本質的な問題を回避しますが、名前ではなくファイルHANDLEも必要とし、(少なくともDelphi 2009の時点では、2010をチェックしていません)どこでもVCLで宣言されている場合は、独自のインポート宣言を提供する必要があります。

于 2009-10-29T08:48:17.253 に答える
10

インディユニットの使用:

uses IdGlobalProtocols;

function FileSizeByName(const AFilename: TIdFileName): Int64;
于 2012-08-04T11:34:20.510 に答える
4

DSiWin32 のDSiFileSizeも使用できます。「すべて」の Delphi で動作します。内部的には、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 }
于 2009-10-29T15:40:44.093 に答える
3

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


FileSizeTurbo Pascal時代から残って いる機能があります。

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

サイズが 2GB を超えるファイルでは機能しませんが (カーディナル キャストに負の場合 - 最大 4GB まで)、「すぐに使える」ものです。


MS-DOS 用に ASM プログラミングを行ったことがある方にはおなじみの方法がもう 1 つあります。Seekポインタを最初のバイト、次に最後のバイトにファイルし、違いを確認します。
Delphi のどのバージョンで導入されたかは正確にはわかりませんが、D5 や D7 などの古いバージョンにはすでにあったと思いますが、それは常識であり、確認することはできません。サイズが取得された後に常にハンドルを閉じるには
、追加の THandle 変数とブロックが必要です。try-finally

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


TFileStream-typed オブジェクトを作成して使用することもできますDelphi 1.0

補足として、この通りはもちろん前述のIOUtilsユニットと統合されています。

于 2012-11-01T06:10:18.340 に答える
2

これは、ジョブを実行する FileSize を使用した短いソリューションです。

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;

私の知る限り、FileSize は XE2 からのみ利用できます。

于 2013-07-18T12:12:05.970 に答える
1
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;
于 2016-09-12T18:31:29.237 に答える