如何在Linux中以编程方式获取给定相对路径的绝对路径?

29

如何在Linux中编程获取给定相对路径的绝对路径?

在Windows中,我们有_fullpath()API。换言之,我指的是在Linux中与Windows的_fullpath类似的API是什么?


由于这个标签是 c,这可能是 https://dev59.com/CHVC5IYBdhLWcg3woSxW 的重复。 - bfontaine
7个回答

24

正如Paul所提到的,使用realpath()函数。但需要注意的是,由于Linux中许多文件系统支持硬链接,因此任何给定目录可能有多个不同的绝对路径。


任何给定的文件肯定可以。硬链接到目录不一定受支持。符号链接在确定“真实”路径时也会引起一些混淆。 - Vatine
@unwind,感谢信息。如果由于硬链接,给定目录解析为多个不同的绝对路径,realpath API 的行为将是什么? - Jay
4
大多数文件系统认为目录的硬链接是不好的和被禁止的。 - edgar.holleis
当然NTFS(即Windows)也具有所有相同复杂性的硬链接:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365006(v=vs.85).aspx。 - bart
似乎没有其他方法可以解析给定绝对基路径的路径,除了当前工作目录。哦,天哪,UNIX有时真的很糟糕,所以我不得不编写自己的函数。 - Lothar
显示剩余3条评论

19

请查看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; 
} 

1
请使用 PATH_MAX 而不是 100。 - Speed8ump
7
如前所述,此代码存在安全漏洞和错误。不要给realpath这样一个很小的缓冲区,因为它很可能会超出缓冲区大小而写入(因为它需要 PATH_MAX的长度)。即使程序不崩溃,如果对手能够控制要解析的原始路径,此代码可能会导致安全漏洞,这取决于变量布局。手册建议将NULL作为第二个参数传递,并让realpath分配内存以确保不出现PATH_MAX定义问题,从POSIX 2008开始。 - Steve Dodier-Lazaro
3
我认为始终记住 PATH_MAX 并不是一个好主意:http://insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html - Ciro Costa

6

尝试使用 realpath

$ man realpath

这也适用于BSD、OS X等操作系统。

3

有一个来自stdlib.hrealpath函数。


3
我马上也想到了realpath,但当我看到你的答案显示realpathstdlib.h中时,我感到非常震惊 - 我说非常震惊 - 因为考虑到realpath不是C库的一部分,这肯定不可能是真的。然而,事实就是如此。我感到非常惊讶。如果一个良好编写的程序定义了自己名为realpath的函数,那么它会发生什么?这些POSIX家伙疯了吧!我说他们已经疯掉了! - Dan Moulding
丹:只要他们在“严格遵守”模式下调用编译器并且不定义任何调用未定义行为的宏(如“_XOPEN_SOURCE”),他们应该没问题。 - caf

2

在RedHat 5.3上运行,realpath不存在但readlink已安装。您可以在相对路径和符号链接上使用它,并且它将为您递归解析符号链接。因此,在我看来,它是比realpath更好的选择。

readlink -f .

0

还有另一种有用的方法,就是使用"readlink -m $filename"。

首先,它可以在不需要目标文件存在的情况下工作。 其次,它可以处理符号链接并获取真实路径。


-3
// 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();
}

3
通常在您的帖子中添加一些关于代码如何工作的解释是一个不错的主意。这有助于新手开发者了解代码的功能。 - Caleb Kleveter
6
甚至不是C语言。 - Nisse Engström

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