2012-02-03 29 views
5

Tôi có rutine này để biết filesize:Làm thế nào có được filesize trong cross-platform cách trên delphi xe2

(Dựa trên 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; 

Tuy nhiên, điều này đưa ra cảnh báo này:

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

Tôi tự hỏi liệu có tồn tại một cách đa nền tảng sạch để thực hiện việc này hay không. Tôi kiểm tra lớp TFile và không tìm thấy nó ...

+1

Nó làm tôi thấy rằng FindFirst dường như là cách để nhận thông tin về kích thước tệp. Đó là truy cập trực quan và thậm chí không phải luôn luôn chính xác. –

Trả lời

5

Trong Delphi XE2, các TSearchRec.Size thành viên đã là Int64 (không chắc chắn phiên bản nào đã thay đổi) và được điền bằng giá trị 64 bit đầy đủ từ các trường TSearchRec.FindData trên Windows, do đó không cần tính kích thước theo cách thủ công, ví dụ:

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

Vì vậy, nó là trong XE. Tôi sẽ không ngạc nhiên nếu điều này đi tất cả các con đường trở lại khung thời gian D4-D6, và mọi người giữ ifdef xây dựng bởi vì nó cũng làm việc trên các phiên bản rất cũ. Nhưng vì gần như không ai vẫn hỗ trợ các phiên bản trước D7, tôi nghĩ đã tới lúc giết con quái vật. –

+0

Nó chuyển sang Int64 trong Delphi 2006. –

4

Cảnh báo bạn nhận được vì cấu trúc FindData của cấu trúc TSearchRec dành riêng cho nền tảng Windows, nhưng bạn không cần phải lo lắng về nó bởi vì trong mã của bạn không truy cập thành viên đó khi bạn ở trên nền tảng khác với 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. Đẹp bắt! –

+0

@TLama, điều này không loại bỏ cảnh báo. –

+0

Nhưng @ François, câu hỏi là nếu có một giải pháp nền tảng chéo (những gì OP đã có), không phải làm thế nào để ngăn chặn các cảnh báo;) Nhưng tôi thích cách của bạn (+1) – TLama

4

Bởi vì bạn đã kiểm tra bạn đang chạy trên Windows, nó là an toàn để loại bỏ cục bộ các cảnh báo có thể giữ chúng "thực" cảnh báo báo cáo bởi trình biên dịch:

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} 
Các vấn đề liên quan