c - scandir 的相对路径处理
问题描述
函数 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
?
解决方案
函数 scandir 是否处理相对路径?
我相信答案是肯定的。从posix scandir我们只知道:
scandir() 函数应扫描目录 dir,[...]
从posix定义:
3.129 目录
包含目录条目的文件。同一目录中没有两个目录条目具有相同的名称
的参数scandir
是char *
,所以它是一个字符串。从posix定义我们知道:
3.271 路径名
用于标识文件的字符串。[...]
另一个名为4.13 Pathname Resolution
delves 的部分介绍了如何解析路径名,并告诉我们:
如果路径名不以 <slash> 开头,则路径名的第一个文件名的前身应被视为进程的当前工作目录 [...](此类路径名称为“相对路径名” )。
因此,因为scandir
需要一个目录的路径名,并且因为路径名是如何解析的,所以是的,您可以提供 scandir 的相对路径。
换句话说
这不是“其他词”-您显示的两个路径名都是绝对的,而不是相对的。在路径名中使用点点不会使路径名相对。
以下两段代码是否等效?
是的。
是否有一些简单的内置函数可以将 /home/hello/wait/../pqr/../../hello 转换为 /home/hello?
在我知道的任何编译器中都没有“内置函数”来规范化路径名。为此目的,POSIX 提供了一个完全正常的函数,称为realpath()。GNU 库可以动态分配返回的字符串,它也有canonicalize_file_name。
推荐阅读
- assembly - 将 If-Else 语句转换为 MIPS 汇编代码
- c++ - 继承和函数参数
- snakemake - 在 Snakemake 规则中迭代 2 个参数
- java - java中的replaceAll(“^\”| \”$”, “”) 有什么作用?
- c++ - 如何更改 QMaps 的 QVector 中元素的值
- javascript - 在 Cypress 循环中,如果条件满足则返回 true,否则在迭代结束后返回 false
- javascript - 为什么这个贪心算法不能计算出正确的硬币数量?
- javascript - 仅在移动浏览器上为 ajax post call 提供 200 状态代码的空响应正文
- python - Python OLAP 框架多维数据集
- c++ - 即使引用计数不为零,如何处理动态加载的DLL也可以被Windows卸载?