在 Inno Setup 中比较路径
Compare paths in Inno Setup
在 Inno Setup Pascal 中是否有内置的方法来比较表示路径的两个字符串?如果没有一个功能,那么也许通过路径的一些规范化。
天真地比较字符串显然是不正确的,即使我们忽略 SameText()
的大小写(根据 Windows 规则)。
至少,正确的比较必须
- 将
\
和 /
视为相同
- 忽略多个分隔符,例如
\
(将它们作为一个分隔符,例如 OS)
- 忽略尾随分隔符(正确比较目录路径,这是主要需要的)
- 解析路径(
foo\..\bar
等于 bar
,至少如果 foo
存在)
- 等(规则众所周知)
- 不需要文件系统中实际存在的路径。
解决绝对路径与相对路径是一个额外的好处,但它需要指定当前路径。也许 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;
在 Inno Setup Pascal 中是否有内置的方法来比较表示路径的两个字符串?如果没有一个功能,那么也许通过路径的一些规范化。
天真地比较字符串显然是不正确的,即使我们忽略 SameText()
的大小写(根据 Windows 规则)。
至少,正确的比较必须
- 将
\
和/
视为相同 - 忽略多个分隔符,例如
\
(将它们作为一个分隔符,例如 OS) - 忽略尾随分隔符(正确比较目录路径,这是主要需要的)
- 解析路径(
foo\..\bar
等于bar
,至少如果foo
存在) - 等(规则众所周知)
- 不需要文件系统中实际存在的路径。
解决绝对路径与相对路径是一个额外的好处,但它需要指定当前路径。也许 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;