Как получить размер файла кросс-платформенным способом на Delphi Xe2 - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть эта рутина, чтобы узнать размер файла:

(На основе 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

IИнтересно, существует ли чистый кроссплатформенный способ сделать это? Я проверяю класс TFile и не нашел его ...

Ответы [ 4 ]

5 голосов
/ 03 февраля 2012

В Delphi XE2 элемент TSearchRec.Size уже является Int64 (не уверен, какая версия изменилась) и заполнен полным 64-битным значением из полей TSearchRec.FindData в Windows, поэтому естьнет необходимости рассчитывать размер вручную, например:

{$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; 
4 голосов
/ 03 февраля 2012

Поскольку вы уже проверили, что работаете в Windows, безопасно удалить локально Предупреждение, чтобы сохранить только «реальные» предупреждения, сообщаемые компилятором:

  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}
4 голосов
/ 03 февраля 2012

Предупреждение, которое вы получаете, потому что 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}
0 голосов
/ 31 марта 2016
TDirectory.GetLastWriteTime(path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...