使用 Inno Setup 创建硬链接

2023-12-10

我有数千个自己的安装程序,需要一个关键的 dll 文件来进行卸载步骤,该 dll 文件大小约为 2 mb,然后为了避免不必要的磁盘空间(2mb * 100 个安装程序),我想将该文件存储一次{cf}然后为需要该文件的下一个安装程序创建硬链接。

我可以在 Inno Setup 中创建硬链接,而不需要外部应用程序,例如mklink.exe usage?

这是我所拥有的一个简短示例,我的所有安装程序都遵循相同的“结构”:

[Files]
; VCL Styles
Source: {tmp}\uninstall.vsf; DestDir: {app}; \
    Flags: ignoreversion
Source: {tmp}\uninstall.dll; DestDir: {app}; \
    Flags: ignoreversion uninsneveruninstall

; Temp files
Source: {tmp}\*; DestDir: {tmp}; Excludes: uninstall.dll, uninstall.vsf; \
    Flags: recursesubdirs createallsubdirs ignoreversion

; Program
Source: {app}\*; DestDir: {app}; \
    Flags: recursesubdirs createallsubdirs ignoreversion

正如你所看到的,我正在移动uninstall.dll to {app},但我想做的是:如果不存在,则复制uninstall.dll文件至{cf}\InnoSetup\uninstall.dll文件路径并建立硬链接{app}\uninstall.dll,如果文件已经存在,那么只需创建硬链接,仅此而已,我不会仍然存储uninstall.dll文件输入{app}\uninstall.dll,只是我想要一个符号引用,因为uninstall.dll文件永远不应该被卸载。

我怎样才能做到呢?


Inno Setup 本身不支持创建硬链接。


我不会考虑mklink外部应用程序。它是一个内置的 Windows 工具。因此,如果您不需要支持 Windows XP,您可以放心地依赖它。或者您可以回退到定期安装 DLL,如果mklink不可用。


或者使用CreateHardLink功能来自Code部分。

#define MyApp "MyApp"
#define UninstallDll "uninstall.dll"

[Files]
Source: "{#UninstallDll}"; DestDir: "{cf}\{#MyApp}"; \
  Flags: ignoreversion uninsneveruninstall
[Code]
function CreateHardLink(lpFileName, lpExistingFileName: string;
  lpSecurityAttributes: Integer): Boolean;
  external '[email protected] stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
  ExistingFile, NewFile: string;
begin
  if CurStep = ssPostInstall then
  begin
    ExistingFile := ExpandConstant('{cf}\{#MyApp}\{#UninstallDll}');
    NewFile := ExpandConstant('{app}\{#UninstallDll}');
    if CreateHardLink(NewFile, ExistingFile, 0) then
    begin
      Log('Hardlink created');
    end
      else
    if FileCopy(ExistingFile, NewFile, False) then
    begin
      // FAT file system?
      Log('Hardlink could not be created, file copied instead');
    end
      else
    begin
      MsgBox('Cannot install {#UninstallDll}', mbError, MB_OK);
    end;
  end;
end;

(测试于Inno Setup 的 Unicode 版本– Inno Setup 6 起的唯一版本)

卸载时不要忘记删除该文件:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  begin
    if DeleteFile(ExpandConstant('{app}\{#UninstallDll}')) then
    begin
      Log('File deleted');
    end
      else
    begin
      Log('Cannot delete file');
    end;
  end;
end;

您当然也可以使用[UninstallDelete]入口。我只是想使用与安装该文件相同的技术来卸载该文件。


您的问题标题是“创建一个hardlink使用 Inno 设置”.

The CreateHardLink创建一个hardlink。硬链接是对相同内容的另一个引用。基本上,硬链接与原始文件无法区分(即使原始文件是hardlink实际上)。原始文件和硬链接都只是对相同内容的引用。如果删除原始文件(或新的硬链接),实际上只是删除了对内容的一个引用。内容仍然保留。仅保留最后一次引用的内容被删除。硬链接does not占用磁盘上的额外空间(内容仅存储一次)。

详情请参阅维基百科上的硬链接文章.

虽然mklink默认情况下创建一个符号链接(也称为符号链接)。符号链接就像快捷方式,它是对原始文件(而不是内容)的引用。它本身就是一个文件,包含目标文件的路径。符号链接有自己的大小(由对目标文件的引用占用)。如果删除原始文件,符号链接仍然存在(因为原始文件中没有对符号链接的引用),但变得无效(内容消失了)。同样,它类似于快捷方式。

详情请参阅维基百科上的符号链接文章.

您可以使用以下命令创建硬链接mklink,如果您添加/H switch:

/H 创建硬链接而不是符号链接。

如果您想创建符号链接而不是硬链接,这是一个不同的问题(尽管答案很简单,请使用CreateSymbolicLink功能)。不过,请注意硬链接不占用磁盘上的额外空间,您似乎关心什么。所以我相信你应该继续使用CreateHardLink功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Inno Setup 创建硬链接 的相关文章

随机推荐

  • pip install psycopg2 在 MacOS M1 和 python 3.10.5 上不起作用

    psycopg2 不适用于 M1 有人安装成功吗 File Library Frameworks Python framework Versions 3 10 lib python3 10 site packages psycopg2 in
  • 使用 R 以及 R 数据框中的条件查询 MS SQL

    我在 MS SQL Server 中有一个相当大的表 1 2 亿行 我想查询它 我在 R 中还有一个数据帧 它具有唯一的 ID 我想将其用作查询条件的一部分 我熟悉 dplyr 包 但不确定是否可以在 MS SQL 服务器上执行 R 查询
  • SCNAction 完成处理程序等待手势执行

    我有一个动画SCNNodes由按钮触发 随后按下该按钮 动画就会反转 前进动画总是工作正常 但后退动画有时会挂起 也就是说 它将播放完成处理程序之前的部分 然后冻结 但是 当我应用三个手势 平移 平移 缩放 中的任何一个时 它会取消挂起并完
  • 如何为 TYPO3 9 LTS 编写路由方面映射器

    我需要一个自定义方面映射器类来定义可选获取参数的值 该参数保存带有额外数据的 cf cache 标识符 但是这个参数产生了一个我不需要的 cHash 参数 并且不想在 URL 中看到 文档 https docs typo3 org typo
  • Spring MVC 图像控制器,用于在 JSP 中显示图像字节

    我有一个 Spring MVC 应用程序 其中一个 JSP 必须显示来自数据库的图像 图像作为 Blob 存储在数据库中 显示它们的最简单方法是什么 我需要什么样的 servlet 控制器来在 JSP 上显示图像字节 应该是一个简单的问题
  • Makefile 问题:g++:致命错误:没有输入文件

    我已经做了什么 我查看了其他具有类似问题的 StackOverflow 线程 但它们似乎都不适用于我的具体情况 我还仔细检查以确保正确的文件位于正确的位置 文件夹 并且所有内容都命名正确 这是我收到的错误 email protected m
  • 如何安装/部署/构建我的 Visual C# 应用程序以便所有用户都可以使用?

    我已经用 Microsoft Visual C 2008 Express Edition 编写了一个应用程序 我想要安装它的 Windows XP 计算机有两个用户帐户 一个是管理员帐户 另一个是主用户帐户 没有管理员权限 我尝试以主用户身
  • 对两个对应的数组进行排序[重复]

    这个问题在这里已经有答案了 我这里的代码有两个数组 它排序arr 这样最高值将位于索引 0 中 现在是第二个数组arr1 包含字符串 我希望代码应用对arr to arr1 以便arr 0 将返回 6 而arr1 0 将返回字符串 d1 注
  • 如何获得这 2 列布局(是否适合内容)

    请注意 垂直滚动条应在需要时显示 左列适合宽度 右栏占据其余空间 这是一种仅使用 CSS 的方法 HTML 看起来像 div div
  • 如何获取char *(char数组)的真实长度和总长度?

    For a char 我可以通过以下方式轻松获得它的长度 char a aaaaa int length sizeof a sizeof char length 6 但是 我不能这样做来获取 a 的长度char by char a new
  • AttributeError:“字节”对象没有属性“编码”; Base64 编码 pdf 文件

    我正在尝试在 python 中对 pdf 进行 Base64 编码 对此的几个答案对其他人有效 但由于某种原因对我而言无效 我最近的尝试是 http stackoverflow com questions 12020885 python c
  • 使用 facebook 2.0 获取好友列表

    有没有办法使用 facebook 2 0 API 获取好友列表 我正在读这个从API升级现在看来要约朋友还是挺困难的 但我看到了2个权限 读取好友列表 用户朋友 他们有办法获取好友列表吗 那么那些从 Facebook 获取好友的小部件会被删
  • C# 中“With...End With”的等价物? [复制]

    这个问题在这里已经有答案了 我知道 C 有using关键字 但是using自动处理该对象 是否有等价的With End With in 视觉基本6 0 它并不等效 但是这种语法对您有用吗 Animal a new Animal Specie
  • JPEG 图像在多个设备上具有不同的像素值

    我注意到 在跨设备读取 JPEG 格式的相同照片时 像素值不匹配 他们很接近 但又不同 转换为 PNG 文件时 像素值似乎匹配 这似乎是由于跨设备的 未 压缩算法造成的 无论如何 这就是我想到的 有没有办法读取 JPEG 文件 以便跨设备从
  • Java FX 的大胆处理有什么问题吗?

    在 JavaFX 中获得粗体标签应该很简单
  • 如何进行 SSH 交互式会话

    今天是个好日子 我需要在linux机器上执行命令这个命令是交互式的 命令 交互式命令意味着需要输入 是 否 或密码 两次 我的真实案例是 我创建一个脚本执行命令并成功获得输出 但有些服务器的登录密码已过期 所以我需要与之交互 服务器发送当前
  • 通过常规表单提交或 Ajax 请求访问时使浏览器重定向的表单 - 这可能吗?

    我有一个带有表单的网页 当用户提交表单时 我希望服务器使浏览器重定向到与表单操作不同的页面 现在 我正在使用 PHP 来做到这一点header函数发送 302 状态码 效果很好 我试图使服务器上的页面以相同的方式重定向浏览器 无论它是正常提
  • RxJS5 随着时间的推移发出数组项并永远重复

    我想随着时间的推移发出数组项 每次发出之间间隔一秒 并且当所有项都已发出时 一遍又一遍地重复 我知道该怎么做 但我想知道是否有比 更简洁的东西 const MY ARRAY one two three const item Rx Obser
  • java.lang.IllegalArgumentException:源不能为空

    问题是什么 当我更新 Ubuntu 软件时它也能工作 主类 package okt springbootstarter test import org springframework boot SpringApplication impor
  • 使用 Inno Setup 创建硬链接

    我有数千个自己的安装程序 需要一个关键的 dll 文件来进行卸载步骤 该 dll 文件大小约为 2 mb 然后为了避免不必要的磁盘空间 2mb 100 个安装程序 我想将该文件存储一次 cf 然后为需要该文件的下一个安装程序创建硬链接 我可