【问题标题】:How to check partition type in Inno Setup?如何在 Inno Setup 中检查分区类型?
【发布时间】:2015-08-18 08:42:19
【问题描述】:

我有需要执行安装程序的任务,安装程序会检查分区类型(例如 FAT32、NTFS),如果分区不支持大于 4GB 的文件,则不允许安装。

说实话,我不知道该怎么做。你是否知道如何去做?也许是一些执行分区类型验证的代码?

如果有任何想法来执行此任务,我将不胜感激。

【问题讨论】:

    标签: inno-setup pascalscript


    【解决方案1】:

    你的问题here有一个答案。

    这个简单的例子检查wpSelectDir页面上的分区类型,如果在目标分区上检测到NTFS,它允许继续安装过程。

    它是为旧版本的 Inno Setup 编写的,因此需要进行一些更改(例如,更改为 MsgBoxFormat2) 如果您使用的是 Unicode Inno,则必须稍作更改。

    您将在下面找到为最新版本的 Unicode Inno Setup 更新的脚本。

    [Setup]
    AppName=Filesystem
    AppVerName=Filesystem
    Uninstallable=false
    UpdateUninstallLogAppName=false
    DisableDirPage=false
    DisableProgramGroupPage=true
    DefaultDirName={pf}\Filesystem
    DisableStartupPrompt=true
    
    [Code]
    #ifdef UNICODE
      #define AW "W"
    #else
      #define AW "A"
    #endif
     
    const
      MAX_PATH = 260;
    
    function GetVolumeInformation(lpRootPathName: string; lpVolumeNameBuffer: string;
      nVolumeNameSize: DWORD; out lpVolumeSerialNumber: DWORD;
      out lpMaximumComponentLength: DWORD; out lpFileSystemFlags: DWORD;
      lpFileSystemNameBuffer: string; nFileSystemNameSize: DWORD): BOOL;
      external 'GetVolumeInformation{#AW}@kernel32.dll stdcall';
    
    function NextButtonClick(CurPage: Integer): Boolean;
    var srcdisk : String;
        sernum, dummy1, dummy2: DWORD;
        fstype: String;
    begin
      Result := true;
      if CurPage = wpSelectDir then
      begin
        srcdisk := AddBackslash(ExtractFileDrive(WizardDirValue));
        fstype := StringOfChar(#0, MAX_PATH + 1);
        if not GetVolumeInformation(
                 srcdisk, '', 0, sernum, dummy1, dummy2, fstype, Length(fstype)) then
        begin
          MsgBox(SysErrorMessage(DLLGetLastError), mbError, mb_Ok);
          Result := false;
        end else
        begin
          fstype := Uppercase(Trim(fstype));
          MsgBox (Format('Volume %s has filesystem type (%s)', [
            srcdisk, fstype]), mbInformation, MB_OK);
          // Only carry on if the file system is NTFS.
          Result := (fstype = 'NTFS');
        end;
      end;
    end;
    

    【讨论】:

    • 这个问题恐怕没有答案。您可以获得卷的文件系统,但无法获得可以存储在那里的文件的最大大小(至少我找不到方法;也搜索了 WMI)。而且由于您可以使用自定义文件系统,因此这不会给您一个可靠的答案(假设您有一个包含常见文件系统大小的表)。
    • FAT32 格式允许最大文件大小为 4GB。因此,该方法应该足以检查选择了哪种卷格式进行安装。关于File Allocation Table的维基
    • 还有自定义文件系统?机会很小,但确实存在。你对所有那些已知的文件系统规范都不走运。
    • 自定义异常:'您的文件系统无法识别。您可以自行承担安装风险。或限制您仅允许在 NTFS 和您批准/支持的其他设备上安装。您也可以修改操作系统 - 然后您不知道它的所有功能......
    • 很公平。这是fixed prototype(附注GetLastError 可能会报告错误结果,因为内部使用的API 调用会覆盖最后一个错误代码,请改用内置DllGetLastError)。而DWORD 是无符号类型,所以LongInt 是错误的。而BOOL 不是Integer。作者使用的类型看起来像是掷骰子的结果(一次使用LongInt,另一次使用Integer 用于同一类型)。
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多