inno-setup - Inno Setup 获取目录大小(包括子目录)

标签 inno-setup pascalscript

我正在尝试编写一个返回目录大小的函数。我编写了以下代码,但它没有返回正确的大小。例如,当我在 {pf} 目录上运行它时,它返回 174 字节,这显然是错误的,因为该目录的大小有多个 GB。这是我的代码:

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 因为该函数需要支持超过 2GB 的目录大小。

最佳答案

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 GB。

关于inno-setup - Inno Setup 获取目录大小(包括子目录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668433/

相关文章:

inno-setup - 如何防止InnoSetup创建开始菜单快捷方式?

delphi - 如何使用 32 位和 64 位之间的安装程序默认值保持 Delphi App IDE 目标文件夹正常运行

inno-setup - 检查 Inno Setup 中是否仅选择了一个特定组件

inno-setup - Inno Setup 函数实现中的语法错误

installation - 如何在卸载期间从 PascalScript 代码更新 InnoSetup 向导 GUI 状态文本

inno-setup - TLabel 或 TNewStaticText - 在 Focus 上更改 .Font.Style,就像 Cursor 随 .Cursor 更改一样

compression - 如何将 RAR 文件添加到使用 Inno Setup 创建的安装可执行文件中而不进行压缩?

installation - 禁用 Inno Setup Next 按钮,直到用户选择单选按钮

java - 在 Inno Setup 中检测 Java 版本

inno-setup - 如何在单个 Inno Setup 安装程序中添加 x86 和 x64 VC++ 2019 Redistributables?