论坛风格切换切换到宽版
  • 3255阅读
  • 11回复

【求助】虎版,请问如何让安装前可以重命名已存在的文件或文件夹? [复制链接]

上一主题 下一主题
离线fielero
 

发帖
20
金钱
200
威望
20
只看楼主 倒序阅读 0 发表于: 2015-05-27
做的更新包想要实现把旧文件备份而非覆盖的功能,求虎版赐教!
离线lovelost

发帖
140
金钱
1060
威望
106
只看该作者 1 发表于: 2015-05-27
[CODE]
if FileOrDirExists(xxx) then RenameFile(xxx);

离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 2 发表于: 2015-05-27
[Files]
Source: "*"; DestDir: "{app}"; Flags: recursesubdirs; BeforeInstall: BackupOldFile

[Code]
procedure BackupOldFile();
begin
  if FileExists(ExpandConstant(CurrentFileName)) then
   RenameFile(ExpandConstant(CurrentFileName), ExpandConstant(CurrentFileName) + '.BAK');
end;
离线lxd198717

发帖
156
金钱
1520
威望
203
只看该作者 3 发表于: 2015-05-27
虎版你好,假如这样呢,文件路径:
F:\Battlefield 4\Core\ActivationUI.exe,
F:\Battlefield 4\Core\imageformats\qgif4.dll
F:\Battlefield 4\Core\imageformats\qico4.dll


1.怎样做到补丁程序能先备份上面所示原始文件到{app}\备份\里面,然后再进行文件替换
2.而且能生成一个恢复原始文件.bat,可以一键完美恢复原始文件。
3.还要自动记住每一个文件的原始路径。做到补丁程序先备份再替换的功能。

有没有相关的实例,谢谢版主。多目录文件替换的搞得我头痛。


本帖提到的人: @gnatix @restools
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2015-05-29
下面的代码供参考。功能:
安装文件前,检查文件是否已经存在。如果存在,则将给文件备份到子目录 “备份文件夹” 中。
在子目录 “备份文件夹” 中自动创建一个批处理文件,运行该批处理文件将恢复所备份的文件到它们原来的位置。

你当然可以在卸载完成后,自动运行该批处理文件,然后删除子目录 “备份文件夹”。不过这个功能还是留给你自己来完成。


[Setup]

AppName=My ProgramAppVersion=1.5
DefaultDirName={pf}\_My ProgramDefaultGroupName=My Program
DirExistsWarning=no

[Files]Source: "e:\HHTest1\*"; DestDir: "{app}"; Flags: recursesubdirs; BeforeInstall: BackupOldFile
Source: "e:\HHTest2\*"; DestDir: "{app}"; Flags: recursesubdirs; BeforeInstall: BackupOldFile

[Code]procedure BackupOldFile();
var  BackupDir, CurFilePath, DesFileDir, DesFileName: string;
begin  CurFilePath:= ExpandConstant(CurrentFileName);
  if FileExists(CurFilePath) then    begin
      BackupDir:= ExpandConstant('{app}\备份文件夹')      if not FileExists(BackupDir + '\恢复.bat') then
        begin          CreateDir(BackupDir);
          SaveStringToFile(BackupDir + '\恢复.bat', '@ ECHO OFF' +  #13#10 + 'REM 恢复备份的文件', False);        end;
      DesFileDir:= ExtractFileDir(CurFilePath);      DesFileName:= ExtractFileName(CurFilePath);
      FileCopy(CurFilePath, BackupDir + '\' + DesFileName, True);      SaveStringToFile(BackupDir + '\恢复.bat', #13#10 + 'copy "' + BackupDir + '\' + DesFileName + '" "' + DesFileDir + '\' + DesFileName + '"', True);
    end;end;
离线fielero

发帖
20
金钱
200
威望
20
只看该作者 5 发表于: 2015-05-29
回 1楼(lovelost) 的帖子
lovelost:if FileOrDirExists(xxx) then RenameFile(xxx);  (2015-05-27 15:33) 

不胜感激!!
离线fielero

发帖
20
金钱
200
威望
20
只看该作者 6 发表于: 2015-05-29
回 2楼(gnatix) 的帖子
gnatix:[Files]Source: "*"; DestDir: "{app}"; Flags: recursesubdirs; BeforeInstall: BackupOldFileprocedure BackupOldFile();....... (2015-05-27 18:58)

谢谢虎版多年来的无私帮助!!
那如果备份的不是文件而是文件夹,并且不是在{app}里而是文档里(比如{userdocs}\新建文件夹,重命名成新建文件夹BAK)呢?而{app}还继续安装程序本体。
离线fielero

发帖
20
金钱
200
威望
20
只看该作者 7 发表于: 2015-05-29
回 1楼(lovelost) 的帖子
lovelost:if FileOrDirExists(xxx) then RenameFile(xxx);  (2015-05-27 15:33) 

可以举个代码范例吗?
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 8 发表于: 2015-05-30
回 6楼(fielero) 的帖子
fielero:谢谢虎版多年来的无私帮助!!那如果备份的不是文件而是文件夹,并且不是在{app}里而是文档里(比如{userdocs}\新建文件夹,重命名成新建文件夹BAK)呢?而{app}还继续安装程序本体。 (2015-05-29 19:19)

那只是一个示例而已,并不是说只是备份 {app} 中的文件。你只要在 [FILES] 段中的每行后面加上 BeforeInstall: BackupOldFile,那么每个现有的旧文件将会在原来的文件夹中备份一份,比如 xyz.abc 将被备份为 xyz.abc.BAK。
示例只是给你一个思路,根据你具体的情况可能需要进行调整。
你最好先具体试试。
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 9 发表于: 2015-05-30
回 7楼(fielero) 的帖子
fielero:可以举个代码范例吗? (2015-05-29 19:24) 

2 楼的代码不就是非常具体的范例吗?