使用Inno Setup创建硬链接

Ele*_*ios 4 installer inno-setup hardlink pascalscript

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

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

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

[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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在将uninstall.dll移动到{app},但我想要做的是:如果不存在,请将uninstall.dll文件复制到{cf}\InnoSetup\uninstall.dllfilepath并创建一个硬链接{app}\uninstall.dll,如果已经存在则该文件然后只是制作硬链接,仅此而已,我不会仍然存储uninstall.dll文件{app}\uninstall.dll,只是我想要一个符号引用因为uninstall.dll文件永远不应该被卸载.

我怎么能这样做?

Mar*_*ryl 5

Inno Setup不支持本机创建硬链接.


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


或者使用本节中的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 'CreateHardLinkW@kernel32.dll 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;
Run Code Online (Sandbox Code Playgroud)

(在Inno Setup的Unicode版本上测试过)

并且不要忘记在卸载时删除该文件

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;
Run Code Online (Sandbox Code Playgroud)

您当然也可以使用该[UninstallDelete]条目.我只想使用与安装它相同的技术卸载该文件.


您的问题标题是" 使用Inno Setup 创建硬链接 ".

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

有关详细信息,请参阅Wikipedia上的硬链接文章.

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

有关详细信息,请参阅Wikipedia上的符号链接文章.

mklink如果添加/H开关,可以使用,创建硬链接:

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

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