问题描述
函数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。