我正在尝试检查文件夹是否具有任何子文件夹,而不会在Linux中通过其孩子迭代。到目前为止我发现的最接近的是 ftw 并停在第一个子文件夹或使用 scandir 并通过结果过滤。但是,出于我的目的,两者都是过度杀伤,我只是想要一个是/否。

在窗户上,这是通过打电话完成的 SHGetFileInfo 然后进行测试 dwAttributes & SFGAO_HASSUBFOLDER 在返回的结构上。 Linux上有这样的选择吗?

有帮助吗?

解决方案

标准答案是致电 统计 在目录上,然后选中ST_NLINK字段(“硬链接数”)。在标准文件系统上,保证每个目录具有2个硬链接(. 以及从父目录到当前目录的链接),因此每个硬链路超出2表示子目录(具体来说,subdirectory's .. 链接到当前目录)。

但是,我的理解是,不需要文件系统来实施此功能(请参阅,例如, 此邮件列表发布),因此不能保证工作。

否则,您必须像这样做:

  1. 使用目录的内容迭代目录的内容 地球 与GNU特定的 GLOB_ONLYDIR 标志,或 Scandir, , 或者 readdir.
  2. 称呼 统计 在每个结果上检查 S_ISDIR(s.st_mode) 验证发现的文件是目录。或者,不合时宜地检查 struct dirent.d_type: : 如果它是 DT_DIR 那是一个文件,如果是 DT_UNKNOWN, ,毕竟您必须统计它。

其他提示

在我看来,您提到的(以及E.James's)的可能性比C ++程序更适合Shell脚本。假定“ 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;
}

getDirentries 要你想做吗?我认为如果没有目录,它将什么都不返回。我会自己尝试过,但是暂时没有进入Linux框:(

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top