如何在Linux中编程获取给定相对路径的绝对路径?
在Windows中,我们有_fullpath()
API。换言之,我指的是在Linux中与Windows的_fullpath
类似的API是什么?
如何在Linux中编程获取给定相对路径的绝对路径?
在Windows中,我们有_fullpath()
API。换言之,我指的是在Linux中与Windows的_fullpath
类似的API是什么?
正如Paul所提到的,使用realpath()
函数。但需要注意的是,由于Linux中许多文件系统支持硬链接,因此任何给定目录可能有多个不同的绝对路径。
请查看realpath函数。
#include <stdlib.h>
#include <stdio.h>
#include <linux/limits.h>
int main()
{
char resolved_path[PATH_MAX];
realpath("../../", resolved_path);
printf("\n%s\n",resolved_path);
return 0;
}
realpath
这样一个很小的缓冲区,因为它很可能会超出缓冲区大小而写入(因为它需要 PATH_MAX的长度)。即使程序不崩溃,如果对手能够控制要解析的原始路径,此代码可能会导致安全漏洞,这取决于变量布局。手册建议将NULL作为第二个参数传递,并让realpath
分配内存以确保不出现PATH_MAX定义问题,从POSIX 2008开始。 - Steve Dodier-Lazaro有一个来自stdlib.h
的realpath
函数。
realpath
,但当我看到你的答案显示realpath
在stdlib.h
中时,我感到非常震惊 - 我说非常震惊 - 因为考虑到realpath
不是C库的一部分,这肯定不可能是真的。然而,事实就是如此。我感到非常惊讶。如果一个良好编写的程序定义了自己名为realpath
的函数,那么它会发生什么?这些POSIX家伙疯了吧!我说他们已经疯掉了! - Dan Moulding在RedHat 5.3上运行,realpath不存在但readlink已安装。您可以在相对路径和符号链接上使用它,并且它将为您递归解析符号链接。因此,在我看来,它是比realpath更好的选择。
readlink -f .
还有另一种有用的方法,就是使用"readlink -m $filename"。
首先,它可以在不需要目标文件存在的情况下工作。 其次,它可以处理符号链接并获取真实路径。
// For C++ with Gnome Gtkmm3 libraries
#include <glibmm.h>
#include <giomm.h>
string PathRel2Abs(string relpath) {
Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(relpath);
return file->get_path();
}
c
,这可能是 https://dev59.com/CHVC5IYBdhLWcg3woSxW 的重复。 - bfontaine