2015-10-06 4 views
4

У меня есть тысячи собственных инсталляторов, для которых требуется критический файл dll для этапа удаления, этот файл dll размером около 2 мб, чтобы избежать ненужного дискового пространства (установщики 2 МБ * 100). Я хотел бы сохранить файл один раз в {cf}, затем сделайте жесткую ссылку для следующих инсталляторов, требующих этого файла.Создайте жесткую ссылку с установкой Inno

Я могу создать жесткую ссылку в 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 

Как вы могли видеть, что я двигаюсь в uninstall.dll к {app}, но то, что я хотел бы сделать, это: Если этого не происходит, скопируйте файл uninstall.dll в файл {cf}\InnoSetup\uninstall.dll путь к файлу и сделайте жесткую ссылку на {app}\uninstall.dll, если уже существует файл, тогда просто создайте hardlink, не более того, я не буду по-прежнему хранят файл uninstall.dll файл в {app}\uninstall.dll , просто я хочу символическую ссылку, потому что файл uninstall.dll никогда не должен удаляться.

Как я мог это сделать?

ответ

5

Inno Setup не поддерживает создание жестких ссылок изначально.


Я бы не рассматривал внешнее приложение mklink. Это встроенный инструмент Windows. Поэтому, если вам не нужна поддержка Windows XP, вы можете спокойно положиться на нее. Или вы можете вернуться к установке DLL регулярно, если mklink недоступен.


Или используйте CreateHardLink function из раздела 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)

И не забудьте удалить файл при удалении

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. Жесткая ссылка - это еще одна ссылка на одно и то же содержимое. В основном жесткая ссылка неотличима от исходного файла (даже исходный файл - это hardlink). И исходный файл, и hardlink - это просто ссылки на одно и то же содержимое. Если вы удалите исходный файл (или новую жесткую ссылку), вы фактически удалите только одну ссылку на содержимое. Содержимое сохраняется. Содержимое удаляется только с последней ссылкой.Жесткая ссылка не занимает дополнительное пространство на диске (содержимое хранится только один раз).

Подробнее см. Hard link article on Wikipedia.

В то время как mklink создает символическую ссылку (или символическую ссылку) по умолчанию. Символьная ссылка похожа на ярлык, это ссылка на исходный файл (не содержимое). Это файл сам по себе, который содержит путь к целевому файлу. Симлинк имеет собственный размер (занятый ссылкой на целевой файл). Если вы удалите исходный файл, символическая ссылка все еще существует (потому что ссылка на символическую ссылку из исходного файла отсутствует), но становится недействительной (содержимое отсутствует). Опять же, это похоже на ярлык.

Подробнее см. Symbolic link article on Wikipedia.

Вы можете создать жесткую связь с mklink, если добавить переключатель /H:

/H Создает жесткую ссылку вместо символической ссылки.

Если вы хотите создать символическую ссылку вместо жесткой связи, это другой вопрос (хотя ответ прост, используйте CreateSymbolicLink function). Хотя еще раз обратите внимание, что жесткая ссылка не занимает дополнительного места на диске, что, по-вашему, вызывает у вас беспокойство. Поэтому я считаю, что вы должны продолжать использовать функцию CreateHardLink.

+0

Спасибо за ответ. Я проясню некоторые вещи: 1. DLL не моя (ее стили VCL для InnoSetup), тогда я не могу развить функцию для повторной компиляции. 2. Мы можем рассматривать mklink.exe как внешнее приложение в значении, которое не является частью Inno Setup, многие ОС Windows «уменьшены» с помощью таких инструментов, как NTLite, WinToolKit и т. Д., Или просто они могут быть удалены вручную пользователем, не является важным приложением. – ElektroStudios

+0

Тогда, если бы я мог вызвать функцию ** CreateHardLink ** WinAPI из паскаль-скрипта в Inno Setup, которая может быть эффективным решением. Взяв пример, который я дал в моем вопросе, не могли бы вы объяснить, как я могу разработать сценарий и когда его называть? Еще раз спасибо. – ElektroStudios

+1

См. Мой отредактированный ответ. –

Смежные вопросы