检查子文件夹是否存在linux

时间:2010-04-05 17:45:30

标签: linux posix-api

我正在尝试检查文件夹是否包含任何子文件夹而不在Linux中迭代其子文件。到目前为止,我发现的最接近的是使用ftw并停在第一个子文件夹中 - 或使用scandir并过滤结果。然而,对我来说,两者都是一种矫枉过正,我只想要一个是/否。

在Windows上,这是通过调用SHGetFileInfo然后在返回的结构上测试dwAttributes & SFGAO_HASSUBFOLDER来完成的。 Linux上有这样的选项吗?

3 个答案:

答案 0 :(得分:4)

标准答案是在目录上调用stat,然后检查st_nlink字段(“硬链接数”)。在标准文件系统上,每个目录保证有2个硬链接(.和从父目录到当前目录的链接),因此超过2的每个硬链接表示一个子目录(具体地说,子目录的{{1链接到当前目录)。

但是,我的理解是文件系统不需要实现这一点(例如,参见this mailing list posting),因此无法保证工作。

否则,你必须按照自己的意愿去做:

  1. 使用glob使用GNU特定的..标记或scandirreaddir来迭代目录的内容。
  2. 对每个结果调用stat并检查GLOB_ONLYDIR以验证找到的文件是目录。或者,非便携式,请检查S_ISDIR(s.st_mode):如果它是struct dirent.d_type,那么它就是一个文件,如果它是DT_DIR,那么您将不得不对其进行统计。

答案 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盒子:(