Delphi 2010以降でファイルのサイズを取得していますか?
-
10-07-2019 - |
質問
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
関数が残っています。
- http://turbopascal.org/system-functions-filepos-and-filesize
- http://docwiki.embarcadero.com/CodeExamples/XE2 / en / SystemFileSize_(Delphi)
- http://docwiki.embarcadero.com/Libraries/XE2/en /System.FileSize
上記のサンプルには「読み取り専用」がありません;モード設定。 ACLがr / oに設定されたCD-ROMメディアまたはフォルダー内のファイルなどのr / oファイルを開く必要があります。 ReSet
を呼び出す前に、 FileMode
グローバル変数にゼロを割り当てる必要があります。
2GBを超えるサイズのファイルでは機能しません(基本的なキャストに対してマイナスの場合-最大4GB)。 1つ。
もう1つのアプローチがあります。MS-DOS用にASMプログラミングを行ったことがある場合は、慣れているかもしれません。 Seek
ファイルポインターを最初のバイトに移動し、最後のバイトに移動して、違いを確認します。
どのDelphiバージョンがそれらを導入したのか正確に言うことはできませんが、D5やD7のような古代のバージョンにすでにあったと思いますが、それは単なる常識であり、確認することはできません。
これにより、サイズが取得された後、常にハンドルを閉じるために、余分なTHandle変数と try-finally
ブロックが必要になります。
- 長さなどを取得するサンプル
- http://docwiki.embarcadero.com/Libraries/XE2 /en/System.SysUtils.FileOpen
- http://docwiki.embarcadero.com/Libraries/XE2 /en/System.SysUtils.FileSeek
最初のアプローチは別として、これは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からのみ利用可能です