gpt4 book ai didi

c++ - 将相对路径转换为完整路径的系统函数,即使对于非现有路径也能正常工作?

转载 作者:行者123 更新时间:2023-11-28 05:53:25 25 4
gpt4 key购买 nike

以前有人问过这个问题,但几乎所有答案都归结为 realpath 函数。这不适用于不存在的路径。我需要一个解决方案,我想调用 POSIX 或 OS X 框架函数而不是手动解析字符串。

重申一下:我需要一个接受任意路径字符串并返回不带“./”或“..”元素的等效路径的函数。

有这样的解决方案吗?

最佳答案

您确定可以有这样的解决方案吗?我相信不会(因为某些目录可能是拼写错误或要创建的符号链接(symbolic link))。

您对 betterrealpath 有何期待?为 /tmp/someinexistentdirectory/foobar 返回的函数?也许用户意图是来自他的 $HOME 的符号链接(symbolic link)。至 /tmp/someinexistentdirectory ?或者可能是打字错误,用户想要 /tmp/someexistentdirectory/foobar ……?那么/tmp/someinexistentdirectory/../foobar呢? ?是否应该规范化为 /tmp/foobar ?为什么?

也许先用dirname(3) , 然后做 realpath(3)在那之上,然后附加 basename(3)的说法应该够了吧?在 C 中是这样的:

  const char*origpath = something();
char*duppath = strdup(origpath);
if (!duppath) { perror("strdup"); exit(EXIT_FAILURE); };
char*basepath = basename(duppath);
char*dirpath = dirname(duppath);
char*realdirpath = realpath(dirpath, NULL);
if (!realdirpath) { perror("realpath"); exit(EXIT_FAILURE); };
char* canonpath = NULL;
if (asprintf(&canonpath, "%s/%s", realdirpath, basepath) <= 0)
{ perror("asprintf"); exit(EXIT_FAILURE); };
free (duppath), duppath = NULL;
basepath = NULL, dirpath = NULL;
/// use canonpath below, don't forget to free it

当然这个例子不适用于/tmp/someinexistentdirectory/foobar但适用于 /home/violet/missingfile ,假设您的主目录是 /home/violet/并且可访问(可读和可执行)...

请随意改进或适应 C++ 上述代码。不要忘记处理故障。

记住 i-nodes是 POSIX 文件系统的核心。一个文件(包括目录)可以有一个、零个或多个文件路径...目录(或文件)名称可以是rename -d 由其他一些正在运行的进程...

也许您想使用像 Qt 这样的框架或 POCO ;他们可能会为您提供足够好的东西...

实际上,我建议您对 betterrealpath 进行编码完全由您自己操作, syscalls(2)在 Linux 上。然后你将不得不考虑所有奇怪的情况......另外,使用 strace(1)realpath(1)了解它在做什么......

或者,不关心包含 ../ 的非规范路径或目录中的符号链接(symbolic link),并简单地将当前目录(参见 getcwd(3) )添加到任何不以 / 开头的路径…………

关于c++ - 将相对路径转换为完整路径的系统函数,即使对于非现有路径也能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com