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

PSk*_*cik 0 c c++ unix

标准化Unix文件路径的一种好方法是什么(即,删除点链接和重复的斜杠)?我既不需要也不需要符号链接解析。

spe*_*ras 5

关于无链接解析的先决条件:

  • 这会使事情变得更复杂(因为否则您可以只使用stdlib的realpath()
  • 它将破坏包含链接的路径。举例来说,a/b/../foo一样的a/foo,如果b是一个符号。例:

    a
    ? b (symlink to c/d)
    ? c ? d
    ?   ? foo
    ? foo
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,a/b/../foo实际上是a/c/foo,而纯粹基于文本的规范化会错误地认为是a/foo

您确定要吗?

如果这样做,则应处理所有这些问题:

  • 空字符串(只需返回“。”)。
  • 多重初始斜线:1或2,保持原样,更重要的是,削减到1。也就是说,/a//a保持不变,但///a////a成为/a。请参阅此处以获取解释。
  • 空位(a//b)应该被删除。
  • 点位(a/./b)应该被去除。
  • 现在最有趣的部分是:双点。
    • 基本思想是它们删除前面的位。a/../ba/b
    • 但是,如果它们一直向上上升到初始斜线,则应将其删除。例如/../a/a。还有/a/../../../b/b
    • 如果它们一直向上上升到没有初始斜线,则应该保留其他斜线。例如../a../a。还有a/../../../b../../b

如果有建议,请查看python lib中的normpath实现。当然,它是python,但算法可读性强。