比较Inno设置中的路径



是否有一种内置的方法来比较Inno Setup Pascal中表示路径的两个字符串?如果没有一个函数,那么也许可以通过对路径进行某种规范化。

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

作为最低要求,正确的比较必须

  • /视为相同
  • 忽略像\这样的多个分隔符(像操作系统一样将它们作为一个分隔符(
  • 忽略尾部分隔符(以正确比较目录路径,这是主要需要的(
  • 解析路径(至少在存在foo的情况下,foo..bar等于bar(
  • 等等。(规则众所周知(
  • 不需要文件系统中实际存在的路径

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

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

组合ExpandFileNameAddBackslashSameText:

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:mypathMyProg.exe') then
RaiseException('Test failed: ' + P);
end;
function InitializeSetup(): Boolean;
begin
TestSamePath('C:mypathMyProg.exe');
TestSamePath('C:mypathMYPROG.exe');
TestSamePath('C:mypath\MyProg.exe');
TestSamePath('C:/my/path/MyProg.exe');
TestSamePath('C:my/path//MyProg.exe');
TestSamePath('C:mypathMyProg.exe');
TestSamePath('C:my..mypathMyProg.exe');
SetCurrentDir('C:');
TestSamePath('mypathMyProg.exe');
TestSamePath('mypathMyProg.exe');
SetCurrentDir('C:my');
TestSamePath('pathMyProg.exe');
TestSamePath('.pathMyProg.exe');
Result := True;
end;

相关内容

最新更新