在C语言中,有什么跨平台的好方法可以连接路径?

4
目前,我有一个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),所以我想知道是否有人知道更清洁/更标准的解决方案。
3个回答

6
首先,您应该使用snprintf而不是连接操作一次构建字符串。这是安全高效的方式。虽然连接在脚本语言中很流行,但在C语言中效率低下且容易出错。
话虽如此,从DOS的第一个有目录的版本(2或3;我忘记是哪个了)开始,'/'作为路径分隔符就已经合法了,在Windows上也一直是合法的。唯一的原因是在DOS支持目录之前设计的许多遗留命令行程序将'/'解释为其命令行解析中的"开关"(选项)字符。过去20年里唯一不支持'/'作为路径分隔符的现实系统是早期的MacOS,但我认为那已经不再是一个可行的目标了。因此,在我看来,您应该始终使用'/',避免使代码混乱不堪。

尽管最近的Windows版本接受'/',但我非常确定旧版本的DOS会拒绝它(至少在命令解释器中)。也许我记错了... - Dmitri
就像我之前所说的,一些DOS命令行程序在将字符串传递给文件系统访问调用之前会自己解释“/'”作为开关字符,在这种情况下你就没办法了。但是在文件系统级别上它总是有效的。 - R.. GitHub STOP HELPING ICE
啊,你说得很对关于snprintf的问题(是的,我更习惯脚本语言)。所以我想最好的选择要么基本上和现在一样(但使用snprintf代替strcat),要么就假设(可能准确)它永远不会在/不能做正确事情的系统上运行。谢谢! - Robert Graffham
如果您真的想支持不同的分隔符,可以让格式字符串根据目标平台进行定义(例如 "%s/%s/%s""%s\\%s\\%s"),或者在格式字符串中使用 %c 来允许插入任意分隔符字符。 - R.. GitHub STOP HELPING ICE
2
Python的os.path.join有一个特性,即如果后续路径以/开头,则所有先前的路径部分都将被丢弃。如果您想将文件名附加到CWD(如果它不以/开头),但在其以/开头时按原样使用它,则此功能非常有用。仅使用snprintf无法实现这一点。 - Craig McQueen

1

很遗憾,标准C库中没有这样的函数来连接文件路径。您需要手动完成。


1

显然GLib有一些函数(例如g_build_path)和宏(G_DIR_SEPARATOR_S等),用于此目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接