Inno setup Inno安装程序:重命名目录失败

Inno setup Inno安装程序:重命名目录失败,inno-setup,Inno Setup,我正在尝试使用RenameFile函数重命名目录,但没有成功。使用DirExists函数,我确认原始目录存在,而新目录不存在。但重命名仍然失败。目录路径仅包含ASCII字符。我正在使用Inno Setup 5.5.5。尝试了Unicode和非Unicode版本。同样的结果。代码是: procedure CurStepChanged(CurStep: TSetupStep); var NewFolder, BackupFolder: String; begin NewFolder := L

我正在尝试使用
RenameFile
函数重命名目录,但没有成功。使用
DirExists
函数,我确认原始目录存在,而新目录不存在。但重命名仍然失败。目录路径仅包含ASCII字符。我正在使用Inno Setup 5.5.5。尝试了Unicode和非Unicode版本。同样的结果。代码是:

procedure CurStepChanged(CurStep: TSetupStep);
var
  NewFolder, BackupFolder: String;
begin
  NewFolder := LgtUserDirPage.Values[0];
  Log('NewFolder: ' + NewFolder);
  if (CurStep = ssInstall) and DirExists(NewFolder) and (pos('backup', WizardSelectedComponents(False)) > 0) then begin
    BackupFolder := NewFolder + '-backup'
    Log('BackupFolder: ' + BackupFolder);
    if DirExists(NewFolder) then Log('Found!');
    if not DirExists(BackupFolder) then Log('No backup!');
    if RenameFile(NewFolder, BackupFolder) then Log('Backup created!');
  end
  else if (CurStep = ssPostInstall) then begin
    if FileExists(BackupFolder + '\settings.lgt') then
      FileCopy(BackupFolder + '\settings.lgt', NewFolder + '\settings.lgt', False);
    if FileExists(BackupFolder + '\settings.logtalk') then
      FileCopy(BackupFolder + '\settings.logtalk', NewFolder + '\settings.logtalk', False)
  end
end;
调试输出为:

Setup application started
Setup version: Inno Setup version 5.5.5 (u)
Original Setup EXE: C:\Users\pmoura\Desktop\Output\logtalk-3.00.0-rc7.exe
Setup command line: /SL5="$3E0350,1739097,119296,C:\Users\pmoura\Desktop\Output\logtalk-3.00.0-rc7.exe" /SPAWNWND=$2D038A /NOTIFYWND=$220252 /DEBUGWND=$11027C 
Windows version: 6.1.7601 SP1  (NT platform: Yes)
64-bit Windows: Yes
Processor architecture: x64
User privileges: Administrative
64-bit install mode: No
Created temporary directory: C:\Users\pmoura\AppData\Local\Temp\is-JA0BI.tmp
NewFolder: C:\Users\pmoura\Documents\Logtalk
BackupFolder: C:\Users\pmoura\Documents\Logtalk-backup
Found!
No backup!

我从未创建过
备份输出。执行从这一行一直到过程的末尾。有人知道有什么原因可以解释重命名失败的原因吗?顺便说一句,磁盘空间不是问题。

发现了问题。原来,
RenameFile
失败了,因为一个打开的shell在我试图重命名的目录中有一个当前目录。在这种情况下,
RenameFile
似乎只是返回
false
。指出问题的权限错误(代码)将更有启发性


现在,我已经更新了脚本,在
重命名文件
失败时向用户发出警告,并指出可能的原因。可以浏览更新代码。

重命名文件
(如其名称所示)重命名文件,而不是文件夹。您可以创建新文件夹,将文件从旧文件夹复制到新文件夹,然后使用
RemoveDir
DelTree
删除原始文件夹。@KenWhite
RenameFile
功能的文档在这方面很清楚:“尝试将OldFile指定的文件或目录的名称更改为NewFile。(…)”。因此,这不应该是问题所在。但感谢您的建议。InnoSetup的Pascal脚本基于Delphi运行时库(RTL),如果您检查源代码,您将看到RTL被调用。该函数的文档说明它重命名文件,而根本没有提到重命名目录。