我有数千个自己的安装程序,需要一个关键的dll文件进行卸载步骤,这个dll文件大小约2 mb然后避免不必要的磁盘空间(2mb * 100安装程序)我想将文件存储在{{1然后为需要该文件的下一个安装程序创建一个硬链接。
我可以在Inno Setup中创建硬链接,而无需使用 mklink.exe 等外部应用程序吗?
这是我所拥有的一个简短示例,我的所有安装程序都遵循相同的“结构”:
{cf}
正如您所看到的,我正在将 uninstall.dll 移至[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 文件到{app}
文件路径并建立到{cf}\InnoSetup\uninstall.dll
的硬链接,如果已存在该文件则只需制作硬链接,仅此而已,我将不会存储 {app}\uninstall.dll
中的uninstall.dll 文件,我想要一个符号引用,因为永远不应该卸载 uninstall.dll 文件。
我怎么能这样做?
答案 0 :(得分:5)
Inno Setup不支持本机创建硬链接。
我不会将mklink
视为外部应用程序。它是一个内置的Windows工具。因此,如果您不需要支持Windows XP,则可以放心使用它。或者,如果mklink
不可用,您可以定期回退安装DLL。
或使用Code
部分中的CreateHardLink
function。
#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;
(在Unicode version of Inno Setup上测试)
不要忘记在卸载时删除文件
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]
条目。我只想使用与安装它相同的技术卸载文件。
您的问题标题是"使用Inno Setup" 创建硬链接。
CreateHardLink
创建硬链接。硬链接是对相同内容的另一个引用。基本上硬链接与原始文件无法区分(即使原始文件实际上是 hardlink )。原始文件和硬链接都只是对相同内容的引用。如果删除原始文件(或新的硬链接),实际上只删除了对内容的一个引用。内容仍然保留。仅使用最后一个引用删除内容。硬链接不占用磁盘上的额外空间(内容只存储一次)。
有关详细信息,请参阅Hard link article on Wikipedia。
默认情况下,mklink
会创建符号链接(也就是符号链接)。符号链接就像一个快捷方式,它是对原始文件(不是内容)的引用。它本身就是一个文件,它包含目标文件的路径。符号链接具有自己的大小(由对目标文件的引用占用)。如果删除原始文件,则符号链接仍然存在(因为原始文件中没有对符号链接的引用),但是变为无效(内容消失)。同样,它类似于捷径。
有关详细信息,请参阅Symbolic link article on Wikipedia。
如果您添加mklink
开关,则可以使用/H
创建硬链接:
/ H创建硬链接而不是符号链接。
如果你想创建符号链接而不是硬链接,那就是一个不同的问题(虽然答案很简单,但使用CreateSymbolicLink
function)。尽管如此,请注意,硬链接不占用磁盘上的额外空间,这似乎是您关注的问题。所以我相信你应该继续使用CreateHardLink
函数。