Inno setup Inno设置&x2013;在更新之前压缩本地文件

Inno setup Inno设置&x2013;在更新之前压缩本地文件,inno-setup,Inno Setup,在运行我的安装程序的新版本时,我希望通过将文件添加到zip存档中来备份现有安装 目前,我可以通过将文件复制到备份目标来备份现有安装。我使用的方法的简化版本如下: [Files] ;Copy the contents of Bin folder to Backup folder. Skip if files don’t exist. Source: {app}\Bin\*; DestDir: {app}\Backup\; Flags: createallsubdirs external rec

在运行我的安装程序的新版本时,我希望通过将文件添加到zip存档中来备份现有安装

目前,我可以通过将文件复制到备份目标来备份现有安装。我使用的方法的简化版本如下:

[Files]
;Copy the contents of Bin folder to Backup folder. Skip if files don’t exist. 
Source: {app}\Bin\*;  DestDir: {app}\Backup\; Flags: createallsubdirs external recursesubdirs uninsneveruninstall skipifsourcedoesntexist;

我很感激你能给我提供一些如何压缩的建议?

你可能想看看LOGAN ISSI:它附带了一些UTIL

另一种方法是包含一个批处理文件,该文件将执行备份步骤,然后在备份完成后将其自身删除

签出此线程:

但是,由于许可,您不允许将rar.dll与您的应用程序捆绑在一起,因此只需应用此方法,而使用可以重新分发的包/dll

如果您可以使用VBScript来编写一个简单的包装器,那么您也可以使用windows内置的zip压缩


查看您的使用方法:

您可能想查看LOGAN ISSI:它附带了一些UTIL

另一种方法是包含一个批处理文件,该文件将执行备份步骤,然后在备份完成后将其自身删除

签出此线程:

但是,由于许可,您不允许将rar.dll与您的应用程序捆绑在一起,因此只需应用此方法,而使用可以重新分发的包/dll

如果您可以使用VBScript来编写一个简单的包装器,那么您也可以使用windows内置的zip压缩


了解您的想法:

感谢用户2976811提供您的备选方案。我使用了TLama的Sugestion,并在Delphi(XE3)中创建了自己的DLL,用于压缩文件夹

library MyZipLib;
uses
  Winapi.Windows,
  System.SysUtils,
  System.Zip;

{$R *.res}

function ZipCompressFolder(SourcePath, DestinationPath, ArchiveName : PChar): boolean; stdcall;
begin
  //If source folder does not exist then exit without error.
  if not DirectoryExists(SourcePath) then
  begin
    result := true;
    exit;
  end;

  try
    result := false;

    //Make sure destination path exists
    ForceDirectories(DestinationPath);
    TZipFile.ZipDirectoryContents(IncludeTrailingPathDelimiter(DestinationPath) + ArchiveName, SourcePath);
    result := true;
  except
    on E : Exception do MessageBox(0, PChar('Error calling function ZipCompressFolder@MyZipLib.dll with message: ' + E.Message + #13#10 + 'Source: ' + SourcePath + #13#10 + 'Dest: ' + DestinationPath+ #13#10 + 'Archive: ' + ArchiveName), 'MyZipLib.dll Error', MB_OK);
  end;
end;

exports ZipCompressFolder;
begin
end.

感谢用户2976811提供您的备选方案。我使用了TLama的Sugestion,并在Delphi(XE3)中创建了自己的DLL,用于压缩文件夹

library MyZipLib;
uses
  Winapi.Windows,
  System.SysUtils,
  System.Zip;

{$R *.res}

function ZipCompressFolder(SourcePath, DestinationPath, ArchiveName : PChar): boolean; stdcall;
begin
  //If source folder does not exist then exit without error.
  if not DirectoryExists(SourcePath) then
  begin
    result := true;
    exit;
  end;

  try
    result := false;

    //Make sure destination path exists
    ForceDirectories(DestinationPath);
    TZipFile.ZipDirectoryContents(IncludeTrailingPathDelimiter(DestinationPath) + ArchiveName, SourcePath);
    result := true;
  except
    on E : Exception do MessageBox(0, PChar('Error calling function ZipCompressFolder@MyZipLib.dll with message: ' + E.Message + #13#10 + 'Source: ' + SourcePath + #13#10 + 'Dest: ' + DestinationPath+ #13#10 + 'Archive: ' + ArchiveName), 'MyZipLib.dll Error', MB_OK);
  end;
end;

exports ZipCompressFolder;
begin
end.

我认为,例如7-zip或zlib DLL可以用来打包文件(如果有可能将其函数导出转换为Inno设置)。或者,您可以自己编写一个非常简单的单用途DLL(正如我所看到的,您是一名母语程序员)。@TLama,我最终使用了您的建议创建了一个DLL。非常感谢!我问这个问题的原因首先是为了再次检查我是否遗漏了一些内置方法,例如“[Files]Source:{app}\Bin*;DestDir:{app}\Backup\my_pseudo_win_zip_folder.zip;”当一个有尊严/知识的用户回答时,我知道没有任何捷径。我相信我的问题已经得到了回答,但我不确定如何结束这个问题。除了我的感激之情,我该如何回报你(从点上看)?你可以,那很好。目前,Inno设置中没有内置的对任何archiver的支持,因此您的答案是一个很好的选择(我已经对它投了赞成票)。而且,我很高兴我能提供帮助,不必担心回报:-)我认为,例如7-zip或zlib DLL可以用来打包文件(如果有可能将其函数导出转换为Inno设置)。或者,您可以自己编写一个非常简单的单用途DLL(正如我所看到的,您是一名母语程序员)。@TLama,我最终使用了您的建议创建了一个DLL。非常感谢!我问这个问题的原因首先是为了再次检查我是否遗漏了一些内置方法,例如“[Files]Source:{app}\Bin*;DestDir:{app}\Backup\my_pseudo_win_zip_folder.zip;”当一个有尊严/知识的用户回答时,我知道没有任何捷径。我相信我的问题已经得到了回答,但我不确定如何结束这个问题。除了我的感激之情,我该如何回报你(从点上看)?你可以,那很好。目前,Inno设置中没有内置的对任何archiver的支持,因此您的答案是一个很好的选择(我已经对它投了赞成票)。而且,我很高兴能帮上忙,不用担心报酬:——)