c++ - 通过删除点链接和重复的斜线规范化 Unix 文件路径

标签 c++ c unix

标准化 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/../ba/b.
    • 但如果它们一直向上到初始斜线,则应将其删除。例如/../a/a。和 /a/../../../b/b
    • 如果它们一直向上直到没有初始斜线,则应保留其他斜线。例如 ../a../a。和 a/../../../b../../b

如果建议您查看 python lib 中的规范路径实现.当然,它是 python,但算法可读性很强。

关于c++ - 通过删除点链接和重复的斜线规范化 Unix 文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31888847/

相关文章:

c++ - 管理 InputIterator 和 OutputIterator 的 `operator*` 返回值的常量性的规则是什么?

c++ - 追踪 WinSock MFC 应用程序中句柄泄漏的来源

C 代码(带逗号运算符)到 Delphi

c - 为什么这段代码在进入 do 循环之前给我一个段错误?

linux - 如何比较同一文件的两个统计值?

windows - 使用标准 Windows 命令行/批处理命令模拟 unix 'cut'

c++ - 为什么我在一份声明中得到多种类型?

c++ - 复制指针然后调用 delete

c - ARM 程序集 - 是否保证寄存器足够大以容纳指针?

linux - 为什么这个 inotifywait shellscript 使用两个 PID?