是否有一种内置的方法来比较Inno Setup Pascal中表示路径的两个字符串?如果没有一个函数,那么也许可以通过对路径进行某种规范化。
天真地比较字符串显然是不正确的,即使我们忽略SameText()
的大小写(根据Windows规则(。
作为最低要求,正确的比较必须
- 将
和
/
视为相同 - 忽略像
\
这样的多个分隔符(像操作系统一样将它们作为一个分隔符( - 忽略尾部分隔符(以正确比较目录路径,这是主要需要的(
- 解析路径(至少在存在
foo
的情况下,foo..bar
等于bar
( - 等等。(规则众所周知(
- 不需要文件系统中实际存在的路径
解析绝对路径与相对路径是一个额外的好处,但它需要指定当前路径。也许CWD是可以的,但我不确定Inno是否接受相对的安装路径。
对于安装程序来说,这一定是一项相当常见的任务,但我很惊讶没有找到一个简单而正确的解决方案。。。
组合ExpandFileName
、AddBackslash
和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: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;