标准化 Unix 文件路径(即删除点链接和重复斜线)的好方法是什么? 我既不需要也不想要符号链接(symbolic link)解析。
最佳答案
关于无链接解析先决条件:
- 它让事情变得更复杂(因为否则你可以使用 stdlib's realpath() 。
它将破坏包含链接的路径。例如,如果
b
是符号链接(symbolic link)。示例:a ┣ b (symlink to c/d) ┣ c ┳ d ┃ ┗ foo ┗ foo
在这种情况下,
a/b/../foo
实际上是a/c/foo
,而纯基于文本的规范化会错误地认为它是a/foo
.
你真的确定要那个吗?
如果你这样做,那么你应该处理所有这些:
- 空字符串(只返回'.')。
- 多个开头的斜杠:1或2,保持原样,超过则减为1。即
/a
和//a
保持不变,但是///a
和////a
变成了/a
。参见 here寻求解释。 - 应删除空位 (
a//b
)。 - 点位 (
a/./b
) 应该被移除。 - 现在是有趣的部分:双点。
- 基本思想是删除前面的位。
a/../b
→a/b
. - 但如果它们一直向上到初始斜线,则应将其删除。例如
/../a
→/a
。和/a/../../../b
→/b
。 - 如果它们一直向上直到没有初始斜线,则应保留其他斜线。例如
../a
→../a
。和a/../../../b
→../../b
。
- 基本思想是删除前面的位。
如果建议您查看 python lib 中的规范路径实现.当然,它是 python,但算法可读性很强。
关于c++ - 通过删除点链接和重复的斜线规范化 Unix 文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31888847/