【问题标题】:What's a good, cross-platform way to concatenate paths in C?在 C 中连接路径的一种好的跨平台方法是什么?
【发布时间】:2011-10-06 17:52:53
【问题描述】:

目前,我有一个path_concat(char* path_fragment_a, char* path_fragment_b) 函数,它简单地将path_fragment_aPATH_DIVIDERpath_fragment_b 连接在一起。 (PATH_DIVIDER 是在 #ifdef 块中定义的,所以它在 Windows 上是 \,在其他任何地方都是 /。)

但我不禁认为这似乎是:

  • 有点笨拙。
  • 一个相当常见的库肯定必须涵盖的东西,如果可用的话会更好用,所以我没有重新发明轮子。

谷歌搜索它刚刚发现了很多关于 Python 的 os.path.join 的结果(这将是理想的,除了它是 Python,而不是 C),所以我想知道是否有人知道更清洁/更标准的解决方案。

【问题讨论】:

    标签: c path cross-platform concatenation


    【解决方案1】:

    首先,您应该使用snprintf,而不是连接操作,一次构造一个字符串。这是安全有效的方法。连接在脚本语言中可能是惯用的,但在 C 中它效率低且有害(容易出现危险错误)。

    话虽如此,自从第一个具有目录的 DOS 版本(2 或 3;我忘记了)以来,'/' 在 DOS 上作为路径分隔符一直是有效的,并且在 Windows 上一直有效也是。没有使用它的唯一原因是在 DOS 支持的目录之前设计的许多遗留命令行程序在其命令行解析中将 '/' 解释为“开关”(选项)字符。过去 20 年中唯一不支持 '/' 作为路径分隔符的真实系统是 OSX 之前的 MacOS,我认为这不再是一个可行的目标,所以在我看来,你应该总是使用 @ 987654325@,并避免因无缘无故的“可移植性”而污染您的代码。

    【讨论】:

    • 虽然最近的 Windows 版本接受 '/',但我很确定我记得旧版本的 DOS 拒绝它(至少在命令解释器中)。可能是我记错了……
    • 正如我所说,一些 DOS 命令行程序在将字符串传递给文件系统访问调用之前将'/' 本身解释为一个开关字符,在这种情况下你就不走运了。但在文件系统级别它总是有效的。
    • 啊,snprintf 的好点子(是的,我更习惯于脚本语言)。所以我猜最好的选择要么与我现在的基本相同(但使用snprintf 而不是strcat),要么假设(可能准确地)它永远不会在/ 不运行的系统上运行不要做正确的事。谢谢!
    • 如果你真的想支持不同的分隔符,你可以让格式字符串按目标平台定义(例如"%s/%s/%s""%s\\%s\\%s")或使用%c's格式化字符串以允许插入任意分隔符。
    • Python 的os.path.join 有一个功能,如果后续路径以/ 开头,则所有之前的路径部分都将被丢弃。如果您想将文件名附加到CWD(如果它不以/ 开头,但如果它以/ 开头,则按原样使用它,这很有用。仅使用 snprintf 不会给你这个。
    【解决方案2】:

    不幸的是,标准 C 库中没有这样的函数来连接文件路径。您必须手动完成。

    【讨论】:

      【解决方案3】:

      显然 GLib 有一些函数(如 g_build_path)和宏(G_DIR_SEPARATOR_S 等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-28
        • 2010-09-13
        • 2015-10-11
        • 2011-10-05
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多