Inno Setup中如何比较路径字符串 是否有内置实现方案?
结论
Inno Setup Pascal 没有直接用于路径字符串比较的内置单函数,但可以通过路径规范化+字符串不区分大小写比较的组合方案实现,完全满足你列出的所有要求。
实现原理
直接复用 Inno Setup 内置的路径处理工具函数即可完成规范化,无需手动编写复杂的路径解析逻辑:
ExpandFileName():纯逻辑层面完成路径标准化,不需要路径真实存在,自动完成以下处理:- 将所有
/替换为Windows标准路径分隔符\ - 折叠连续的多个
\为单个分隔符 - 自动解析相对路径标记
.和..
- 将所有
RemoveBackslash():去掉路径末尾的分隔符,避免目录路径因末尾有无斜杠产生对比差异SameText():按照Windows路径不区分大小写的规则对比规范化后的字符串
代码实现
function ArePathsEqual(Path1, Path2: string; BasePath: string = ''): Boolean; var Normalized1, Normalized2: string; begin // 传入基准路径时,自动将相对路径转换为绝对路径再处理 if BasePath <> '' then begin Path1 := ExpandFileName(AddBackslash(BasePath) + Path1); Path2 := ExpandFileName(AddBackslash(BasePath) + Path2); end; // 完成路径规范化 Normalized1 := ExpandFileName(Path1); Normalized2 := ExpandFileName(Path2); // 统一去掉末尾分隔符 Normalized1 := RemoveBackslash(Normalized1); Normalized2 := RemoveBackslash(Normalized2); // 不区分大小写对比 Result := SameText(Normalized1, Normalized2); end;
使用说明
- 对比两个绝对路径:直接传两个路径参数即可,例如
ArePathsEqual('C:\foo/bar\\', 'C:/foo\bar')返回True - 对比相对路径:传入基准路径作为第三个参数即可,例如对比相对安装目录的路径时,传
{app}作为基准路径:ArePathsEqual('foo\..\bar', 'bar', ExpandConstant('{app}'))返回True
内容的提问来源于stack exchange,提问作者Zeus
相关产品推荐
相关产品推荐

