【问题标题】:Relative Path Handling by scandirscandir 的相对路径处理
【发布时间】:2020-09-09 20:23:54
【问题描述】:

函数scandir是否处理相对路径?

也就是说,下面两段代码是等价的吗?

int NUM = scandir("/home/hello/wait/../pqr/../../hello", &LIST, 0, alphasort);
int NUM = scandir("/home/hello", &LIST, 0, alphasort);

如果没有,是否有一些简单的内置函数可以将/home/hello/wait/../pqr/../../hello 转换为/home/hello

【问题讨论】:

  • 您可以自己构建函数来规范路径。

标签: c relative-path scandir


【解决方案1】:

函数scandir是否处理相对路径?

我相信答案是肯定的。从posix scandir我们只知道:

scandir() 函数将扫描目录 dir,[...]

来自posix定义:

3.129 目录

包含目录条目的文件。同一个目录中没有两个目录项同名

scandir 的参数是char *,所以它是一个字符串。从 posix 定义中我们知道:

3.271 路径名

用于标识文件的字符串。 [...]

另一个名为 4.13 Pathname Resolution 的部分深入探讨了路径名是如何解析的,并告诉我们:

如果路径名不以 开头,则路径名的第一个文件名的前身应被视为进程的当前工作目录 [...](此类路径名称为“相对路径名")。

所以因为scandir 采用了一个目录的路径名,并且由于路径名是如何解析的,所以是的,您可以提供scandir 的相对路径。


换句话说

这不是“其他词” - 您显示的两个路径名都是绝对的,而不是相对的。在路径名中使用 dot-dot 不会使路径名相对。

以下两段代码是否等价?

是的。


是否有一些简单的内置函数可以将 /home/hello/wait/../pqr/../../hello 转换为 /home/hello?

在我知道的任何编译器中,都没有 "builtin function" 来规范化路径名。 POSIX 为此目的提供了一个完全正常的函数,称为realpath()。 GNU 库可以动态分配返回的字符串,它也有canonicalize_file_name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2012-07-07
    • 2011-01-29
    相关资源
    最近更新 更多