inno setup打包java_java-Inno Setup:删除以前版本安装的文件

您可以在安装之前卸载以前的版本:

如果无法完全卸载,则必须实施部分卸载.

理想的做法是对卸载程序日志(unins000.dat)进行反向工程,仅将安装解压缩到lib子文件夹并进行处理(撤消).但是由于这是一个未公开的二进制文件,所以可能很难做到.

如果您在[文件]部分中维护要安装的文件的明确列表,例如

[Files]

Source: "lib\dependency-A-1.2.3.jar"; Dest: "{app}\lib"

Source: "lib\dependency-B-2.3.4.jar"; Dest: "{app}\lib"

然后,每当依赖项更改时,将先前版本移至[InstallDelete]部分:

[Files]

Source: "lib\dependency-A-1.3.0.jar"; Dest: "{app}"

Source: "lib\dependency-B-2.3.4.jar"; Dest: "{app}"

[InstallDelete]

{app}\lib\dependency-A-1.2.3.jar

如果您使用通配符安装依赖项,

[Files]

Source: "lib\*.jar"; Dest: "{app}\lib"

并且您无法对卸载程序日志进行反向工程,则必须通过自己的方式复制其功能.

您可以使用preprocessor生成具有已安装依赖性的文件.将该文件安装到{app}文件夹中,并在安装前处理该文件.

[Files]

Source: "MyApp.jar"; DestDir: "{app}"

Source: "lib\*.jar"; DestDir: "{app}\lib"

#define ProcessFile(Source, FindResult, FindHandle) \

Local[0] = FindGetFileName(FindHandle), \

Local[1] = Source + "\\" + Local[0], \

Local[2] = FindNext(FindHandle), \

"'" + Local[0] + "'#13#10" + \

(Local[2] ? ProcessFile(Source, Local[2], FindHandle) : "")

#define ProcessFolder(Source) \

Local[0] = FindFirst(Source + "\\*.jar", faAnyFile), \

ProcessFile(Source, Local[0], Local[0])

#define DepedenciesToInstall ProcessFolder("lib")

#define DependenciesLog "{app}\dependencies.log"

[UninstallDelete]

Type: files; Name: "{#DependenciesLog}"

[Code]

procedure CurStepChanged(CurStep: TSetupStep);

var

AppPath, DependenciesLogPath: string;

Dependencies: TArrayOfString;

Count, I: Integer;

begin

DependenciesLogPath := ExpandConstant('{#DependenciesLog}');

if CurStep = ssInstall then

begin

{ If dependencies log already exists, remove the previously installed dependencies }

if LoadStringsFromFile(DependenciesLogPath, Dependencies) then

begin

Count := GetArrayLength(Dependencies);

Log(Format('Loaded %d dependencies, deleting...', [Count]));

for I := 0 to Count - 1 do

DeleteFile(ExpandConstant('{app}\lib\' + Dependencies[I]));

end;

end

else

if CurStep = ssPostInstall then

begin

{ Now that the app folder already exists, }

{ save dependencies log (to be processed by future upgrade) }

if SaveStringToFile(DependenciesLogPath, {#DepedenciesToInstall}, False) then

begin

Log('Created dependencies log');

end

else

begin

Log('Failed to create dependencies log');

end;

end;

end;

另一种方法是删除最新安装程序未安装的安装文件夹中的所有文件.

最简单的解决方案是在安装之前删除安装文件夹中的所有文件.

您可以使用[InstallDelete] section.但是,如果您在安装文件夹中有一些具有配置的文件夹/文件,则不允许您排除它们.

procedure CurStepChanged(CurStep: TSetupStep);

begin

if CurStep = ssInstall then

begin

DelTreeExceptSavesDir(WizardDirValue);

end;

end;

如果您确实只想删除过时的文件,为避免删除和重新创建现有文件,可以使用预处理器生成要为Pascal脚本安装的文件列表,并使用该列表仅删除真正过时的文件.

#pragma parseroption -p-

#define FileEntry(DestDir) \

" FilesNotToBeDeleted.Add('" + LowerCase(DestDir) + "');\n"

#define ProcessFile(Source, Dest, FindResult, FindHandle) \

FindResult \

? \

Local[0] = FindGetFileName(FindHandle), \

Local[1] = Source + "\\" + Local[0], \

Local[2] = Dest + "\\" + Local[0], \

(Local[0] != "." && Local[0] != ".." \

? FileEntry(Local[2]) + \

(DirExists(Local[1]) ? ProcessFolder(Local[1], Local[2]) : "") \

: "") + \

ProcessFile(Source, Dest, FindNext(FindHandle), FindHandle) \

: \

""

#define ProcessFolder(Source, Dest) \

Local[0] = FindFirst(Source + "\\*", faAnyFile), \

ProcessFile(Source, Dest, Local[0], Local[0])

#pragma parseroption -p+

[Code]

var

FilesNotToBeDeleted: TStringList;

function InitializeSetup(): Boolean;

begin

FilesNotToBeDeleted := TStringList.Create;

FilesNotToBeDeleted.Add('\data');

{#Trim(ProcessFolder('build\exe.win-amd64-3.6', ''))}

FilesNotToBeDeleted.Sorted := True;

Result := True;

end;

procedure DeleteObsoleteFiles(Path: string; RelativePath: string);

var

FindRec: TFindRec;

FilePath: string;

FileRelativePath: string;

begin

if FindFirst(Path + '\*', FindRec) then

begin

try

repeat

if (FindRec.Name <> '.') and (FindRec.Name <> '..') then

begin

FilePath := Path + '\' + FindRec.Name;

FileRelativePath := RelativePath + '\' + FindRec.Name;

if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then

begin

DeleteObsoleteFiles(FilePath, FileRelativePath);

end;

if FilesNotToBeDeleted.IndexOf(Lowercase(FileRelativePath)) < 0 then

begin

if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then

begin

if RemoveDir(FilePath) then

begin

Log(Format('Deleted obsolete directory %s', [FilePath]));

end

else

begin

Log(Format('Failed to delete obsolete directory %s', [FilePath]));

end;

end

else

begin

if DeleteFile(FilePath) then

begin

Log(Format('Deleted obsolete file %s', [FilePath]));

end

else

begin

Log(Format('Failed to delete obsolete file %s', [FilePath]));

end;

end;

end;

end;

until not FindNext(FindRec);

finally

FindClose(FindRec);

end;

end

else

begin

Log(Format('Failed to list %s', [Path]));

end;

end;

procedure CurStepChanged(CurStep: TSetupStep);

begin

if CurStep = ssInstall then

begin

Log('Looking for obsolete files...');

DeleteObsoleteFiles(WizardDirValue, '');

end;

end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值