我目前正在重新编码“ ls”命令以进行学习。但是,当我浏览文件时:尝试打开符号链接所指向的路径的“文件夹”时,可能会出错。因为它不是目录(我以为所有符号链接都指向文件夹)。
如何检查它是否指向目录? (我看了手册,stat,dir ..)
答案 0 :(得分:4)
我认为所有符号链接都指向文件夹
不。符号链接是对另一路径的间接引用。该其他路径可以引用可以在任何已安装文件系统中表示的任何类型的文件,也可以完全不引用任何文件(即它可以是断开的链接)。
如何检查它是否指向目录?
您提到了stat()
函数,但是要重新实现ls
,您应该主要使用lstat()
。区别在于,当指定的路径引用符号链接时,stat
返回有关链接目标路径的信息,而lstat
返回有关链接本身的信息(包括有关文件类型的信息),可以说它是 链接)。
在遇到符号链接的情况下,只需使用stat()
再次检查相同的路径即可找出其指向的文件类型。 stat()
将递归地解析符号链接,以发现最终目标的信息,只有最终目标信息才是符号链接。无论如何,您都不需要为特定目的在断开的链接和任何其他形式的非目录之间进行区分。
答案 1 :(得分:0)
我只是遇到了同样的问题,这是我的解决方案:
bool IsDir(const char *path)
{
std::string tmp = path;
tmp += '/';
struct stat statbuf;
return (lstat(tmp.c_str(), &statbuf) >= 0) && S_ISDIR(statbuf.st_mode);
}
关键是路径中的尾巴/
但是,我不知道它是否便携