2012-02-03 8 views
5

ho questo rutine di conoscere la dimensione del file:Come ottenere la dimensione del file in modo cross-platform su Delphi XE2

(Basato su 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; 

Tuttavia, questo dare questo avvertimento:

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

Mi chiedo se esista un modo multipiattaforma per farlo. Controllo classe TFile e non lo trovo ...

+1

Mi deprime che FindFirst sembra essere il modo per ottenere le informazioni sulla dimensione del file. È contro intuitivo e nemmeno sempre accurato. –

risposta

5

In Delphi XE2, il TSearchRec.Size membro è già un Int64 (non sono sicuro che la versione che ha cambiato in) e viene riempito con il pieno valore a 64 bit dai TSearchRec.FindData campi su Windows, quindi non c'è alcuna necessità di calcolare la dimensione manualmente, ad esempio:

{$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

Quindi è in XE. Non sarei sorpreso se questo dovesse tornare al periodo D4-D6, e la gente ha mantenuto il costrutto ifdef perché ha anche funzionato su versioni molto vecchie. Ma dal momento che quasi nessuno ancora supporta le versioni prima della D7, penso che sia ora di uccidere la bestia. –

+0

È passato a un Int64 in Delphi 2006. –

4

L'avviso che si ottiene perché il FindData membro della struttura TSearchRec è specifico per la piattaforma Windows, ma non è necessario preoccuparsi perché nel codice si è non accedere a quel membro quando si è sulla piattaforma diversa da 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. Bella presa! –

+0

@TLama, questo non rimuove l'avviso. –

+0

Ma @ François, la domanda è se c'è una soluzione multipiattaforma (che OP ha già), non come sopprimere l'avviso;) Ma a me piace (+ 1ed) – TLama

4

Poiché è già controllare è in esecuzione su Windows, è possibile rimuovere localmente l'Attenzione a mantenere solo avvertimenti "reali" segnalati dal compilatore:

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); 
Problemi correlati