在 Inno Setup 中比较路径

Compare paths in Inno Setup

在 Inno Setup Pascal 中是否有内置的方法来比较表示路径的两个字符串?如果没有一个功能,那么也许通过路径的一些规范化。

天真地比较字符串显然是不正确的,即使我们忽略 SameText() 的大小写(根据 Windows 规则)。

至少,正确的比较必须

解决绝对路径与相对路径是一个额外的好处,但它需要指定当前路径。也许 CWD 没问题,但我不确定 Inno 是否接受相对安装路径。

对于安装人员来说,这一定是一项相当常见的任务,但我很惊讶没有找到一个简单而正确的解决方案...

合并ExpandFileName, AddBackslash and SameText:

function SamePath(P1, P2: string): Boolean;
begin
  P1 := AddBackslash(ExpandFileName(P1));
  P2 := AddBackslash(ExpandFileName(P2));
  Result := SameText(P1, P2);
end;

ExpandFileName:

  • / 转换为 \
  • 将一系列斜杠规范化为一个反斜杠(UNC 路径中的前导反斜杠除外)。
  • 解析相对路径。

AddBackslash 负责忽略 尾随分隔符


测试:

procedure TestSamePath(P: string);
begin
  if not SamePath(P, 'C:\my\path\MyProg.exe') then
    RaiseException('Test failed: ' + P);
end;

function InitializeSetup(): Boolean;
begin
  TestSamePath('C:\my\path\MyProg.exe');
  TestSamePath('C:\my\path\MYPROG.exe');
  TestSamePath('C:\my\path\MyProg.exe');
  TestSamePath('C:/my/path/MyProg.exe');
  TestSamePath('C:\my/path//MyProg.exe');
  TestSamePath('C:\my\path\MyProg.exe\');
  TestSamePath('C:\my\..\my\path\MyProg.exe');

  SetCurrentDir('C:\');
  TestSamePath('\my\path\MyProg.exe');
  TestSamePath('my\path\MyProg.exe');

  SetCurrentDir('C:\my');
  TestSamePath('path\MyProg.exe');
  TestSamePath('.\path\MyProg.exe');
  Result := True;
end;