2017-01-16 5 views
1

Я пытаюсь написать функцию, которая возвращает размер каталога. Я написал следующий код, но он не возвращает правильный размер. Например, когда я запускаю его в каталоге {pf}, он возвращает 174 байта, что явно неверно, так как этот каталог имеет размер в несколько гигабайт. Вот код, у меня есть:Inno Setup получить размер каталога, включая подкаталоги

function GetDirSize(DirName: String): Int64; 
var 
    FindRec: TFindRec; 
begin 
    if FindFirst(DirName + '\*', FindRec) then 
    begin 
     try 
     repeat 
      Result := Result + (Int64(FindRec.SizeHigh) shl 32 + FindRec.SizeLow); 
     until not FindNext(FindRec); 
     finally 
     FindClose(FindRec); 
     end; 
    end 
    else 
    begin 
     Result := -1; 
    end; 
end; 

Я подозреваю, что функция FindFirst не включает подкаталоги, поэтому я не получаю правильный результат. Поэтому, как я могу вернуть правильный размер каталога, т. Е. Включая все файлы во всех подкаталогах, так же, как выбрать «Свойства в папке» в проводнике Windows? Я использую FindFirst, поскольку функция должна поддерживать размеры каталогов более 2 ГБ.

ответ

1

FindFirst действительно включает в себя подкаталоги, но он не даст вам своих размеров.

Вы должны переписать в подкаталоги и рассчитать общий размер файла по файлу, аналогично, например, Inno Setup: copy folder, subfolders and files recursively in Code section.

function GetDirSize(Path: String): Int64; 
var 
    FindRec: TFindRec; 
    FilePath: string; 
    Size: Int64; 
begin 
    if FindFirst(Path + '\*', FindRec) then 
    begin 
    Result := 0; 
    try 
     repeat 
     if (FindRec.Name <> '.') and (FindRec.Name <> '..') then 
     begin 
      FilePath := Path + '\' + FindRec.Name; 
      if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then 
      begin 
      Size := GetDirSize(FilePath); 
      end 
      else 
      begin 
      Size := Int64(FindRec.SizeHigh) shl 32 + FindRec.SizeLow; 
      end; 
      Result := Result + Size; 
     end; 
     until not FindNext(FindRec); 
    finally 
     FindClose(FindRec); 
    end; 
    end 
    else 
    begin 
    Log(Format('Failed to list %s', [Path])); 
    Result := -1; 
    end; 
end; 

Для Int64, вам нужно Unicode version of Inno Setup, что вы должны использовать в любом случае. Только если у вас есть веская причина придерживаться версии Ansi, вы можете заменить Int64 на Integer, но вы ограничены 2 ГБ.

+0

У меня есть версия 2.2 и Int64 не распознается. Какую альтернативу я могу использовать? – Brian

+0

@Brian Версия 2.2 чего? –

+0

2.2 inno setup studio – Brian