【问题标题】:How to get the absolute path for a given relative path programmatically in Linux?如何在 Linux 中以编程方式获取给定相对路径的绝对路径?
【发布时间】:2011-01-21 11:00:29
【问题描述】:

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

如果是 Windows,我们有 _fullpath() API。换句话说,我的意思是在 Linux 中类似于_fullpath 的 Windows 的 API 是什么?

【问题讨论】:

标签: c linux relative-path absolute-path


【解决方案1】:

正如保罗所说,使用@987654321@。但请注意,由于 Linux 中的许多文件系统都支持hard links,因此任何给定目录都可以有许多不同的绝对路径。

【讨论】:

  • 任何给定的文件都可以,当然。不一定支持到目录的硬链接。在确定“真实”路径时,符号链接也会引起一些混乱。
  • @unwind,感谢您的信息。如果由于硬链接,如果给定目录解析为多个不同的绝对路径,realpath API 的行为将是什么?
  • 到目录的硬链接被认为是邪恶的并且被大多数文件系统禁止。
  • 我有点困惑。给定目录是否有可能解析为许多不同的绝对路径?如果是,那么行为 realpath 会是什么?
  • @Jay 它不会影响将相对路径解析为绝对路径。
【解决方案2】:

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

【讨论】:

  • 请使用 PATH_MAX 而不是 100
  • 正如上面所指出的,这段代码是不安全且有缺陷的。 不要realpath 提供这么小的缓冲区,这很可能会超出缓冲区大小(因为它需要 PATH_MAX 的长度)。即使程序没有崩溃,如果攻击者可以控制要解析的原始路径,此代码也可能导致安全漏洞,具体取决于变量布局。该手册建议将 NULL 作为第二个参数传递并让realpath 分配内存以确保 PATH_MAX 定义没有问题,从 POSIX 2008 开始。
  • 我认为永远记住 PATH_MAX 根本不是:insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html
【解决方案3】:

试试realpath:

$ man realpath

这在 BSD、OS X 等中也可用。

【讨论】:

    【解决方案4】:

    有来自stdlib.hrealpath

    【讨论】:

    • 我也立即想到了 realpath,但我惊呆了 -- 惊呆了 我说 -- 当我看到你的回答表明 @987654324 @ 在stdlib.h 中。考虑到realpath 不是C 库的一部分,这肯定不可能 为真。瞧,这是真的。我傻眼了。定义自己的名为realpath 的函数的格式良好的程序是什么?那些 POSIX 家伙已经发疯了! Amok 我说!
    • Dan:只要他们以“严格符合”模式调用编译器,并且不定义任何调用未定义行为的宏(如_XOPEN_SOURCE),就应该没问题。
    【解决方案5】:

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

    读取链接 -f 。

    【讨论】:

      【解决方案6】:

      这也是另一种有用的方式,比如“readlink -m $filename”

      首先,它不需要目标文件存在就可以工作。 其次,它将处理符号链接并获得真正的路径。

      【讨论】:

        【解决方案7】:
        // 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。
        猜你喜欢
        • 1970-01-01
        • 2021-08-15
        • 2010-09-21
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2011-02-07
        相关资源
        最近更新 更多