2012-02-03 20 views
5

上のクロスプラットフォームな方法でファイルサイズを取得、私はファイルサイズを知るために、このrutineを持っている:どのようにデルファイXE2

http://delphi.about.com/od/delphitips2008/qt/filesize.htmに基づく)

function FileSize(fileName : String) : Int64; 
var 
    sr : TSearchRec; 
begin 
    if FindFirst(fileName, faAnyFile, sr) = 0 then 
    {$IFDEF MSWINDOWS} 
    result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow) 
    {$ELSE} 
    result := sr.Size 
    {$ENDIF} 
    else 
    result := -1; 

    FindClose(sr) ; 
end; 

しかし、これは、この警告を与える:

[DCC Warning] Funciones.pas(61): W1002 Symbol 'FindData' is specific to a platform 

これを行うには、クリーンなクロスプラットフォームの方法が存在するのだろうかと思います。私はTFileクラスをチェックして、それを見つけられませんでした...

+1

FindFirstがファイルサイズ情報を取得する方法であるように見えます。それは直感的ではなく、常に正確ではない。 –

答えて

5

メンバーは既にInt64(変更されたバージョンがわからない)で、WindowsのTSearchRec.FindDataフィールドの64ビット値で完全に埋められているため、手動でサイズを計算する必要はありません。たとえば、

{$IFDEF VER230} 
    {$DEFINE USE_TSEARCHREC_SIZE} 
{$ELSE} 
    {$IFNDEF MSWINDOWS} 
    {$DEFINE USE_TSEARCHREC_SIZE} 
    {$ENDIF} 
{$ENDIF} 

function FileSize(fileName : String) : Int64; 
var 
    sr : TSearchRec; 
begin 
    if FindFirst(fileName, faAnyFile, sr) = 0 then 
    begin 
    {$IFDEF USE_TSEARCHREC_SIZE} 
    Result := sr.Size; 
    {$ELSE} 
    Result := (Int64(sr.FindData.nFileSizeHigh) shl 32) + sr.FindData.nFileSizeLow; 
    {$ENDIF} 
    FindClose(sr); 
    end 
    else 
    Result := -1; 
end; 
+0

それはXEにもあります。これがD4-D6のタイムフレームに戻っても驚くことはありません。また、非常に古いバージョンでも動作するため、人々はifdef構造を保持していました。しかし、D7以前はまだ誰もバージョンをサポートしていないので、私はその獣を殺す時間だと思う。 –

+0

Delphi 2006でInt64に切り替えました。 –

4

FindData構造のTSearchRec構造のメンバはWindowsプラットフォームに特有なものですが、あなたのコードではあなたのことを心配する必要はありません。 Windowsとは異なるプラットフォーム上にいるときにそのメンバーにアクセスしません。

// condition if you are on the Windows platform 
{$IFDEF MSWINDOWS} 
    // here you can access the FindData member because you are 
    // on Windows 
    Result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + 
    Int64(sr.FindData.nFileSizeLow); 
{$ELSE} 
    // here you can't use FindData member and you would even 
    // get the compiler error because the FindData member is 
    // Windows specific and you are now on different platform 
{$ENDIF} 
+1

+1。ナイスキャッチ! –

+0

@ TLama、これは警告を削除しません。 –

+0

しかし、@フランソワ、問題は、クロスプラットフォームのソリューション(どのOPが既に持っている)、警告を抑制する方法ではない場合)ですが、私はあなたの方法が好きです(+ 1ed) – TLama

4

あなたはすでにあなたがWindows上で実行されているチェックしているので、ローカルにコンパイラによって報告された唯一の「本物」の警告を維持するための警告を削除しても安全である:デルファイXE2、TSearchRec.Size

if FindFirst(fileName, faAnyFile, sr) = 0 then 
    {$IFDEF MSWINDOWS} 
    {$WARN SYMBOL_PLATFORM OFF} 
    result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow) 
    {$WARN SYMBOL_PLATFORM ON} 
    {$ELSE} 
0
TDirectory.GetLastWriteTime(path); 
関連する問題