我正在尝试检查文件夹是否包含任何子文件夹而不在Linux中迭代其子文件。到目前为止,我发现的最接近的是使用ftw
并停在第一个子文件夹中 - 或使用scandir
并过滤结果。然而,对我来说,两者都是一种矫枉过正,我只想要一个是/否。
在Windows上,这是通过调用SHGetFileInfo
然后在返回的结构上测试dwAttributes & SFGAO_HASSUBFOLDER
来完成的。 Linux上有这样的选项吗?
答案 0 :(得分:4)
标准答案是在目录上调用stat,然后检查st_nlink字段(“硬链接数”)。在标准文件系统上,每个目录保证有2个硬链接(.
和从父目录到当前目录的链接),因此超过2的每个硬链接表示一个子目录(具体地说,子目录的{{1链接到当前目录)。
但是,我的理解是文件系统不需要实现这一点(例如,参见this mailing list posting),因此无法保证工作。
否则,你必须按照自己的意愿去做:
答案 1 :(得分:2)
你提到的可能性(以及e.James的)在我看来它们更适合于shell脚本而不是C ++程序。假设“C ++”标签是故意的,我认为您可能最好直接使用POSIX API:
// warning: untested code.
bool has_subdir(char const *dir) {
std::string dot("."), dotdot("..");
bool found_subdir = false;
DIR *directory;
if (NULL == (directory = opendir(dir)))
return false;
struct dirent *entry;
while (!found_subdir && ((entry = readdir(directory)) != NULL)) {
if (entry->d_name != dot && entry->d_name != dotdot) {
struct stat status;
stat(entry->d_name, &status);
found_subdir = S_ISDIR(status.st_mode);
}
}
closedir(directory);
return found_subdir;
}
答案 2 :(得分:0)
getdirentries是否希望您这样做?我认为如果没有目录,它应该什么也不返回。我本来会尝试这个,但暂时没有访问linux盒子:(