scandir的相对路径处理

问题描述

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

换句话说,以下两段代码是否等效?

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

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

解决方法

函数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