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
功能。