Question

Je suis en train de vérifier si un dossier a des sous-dossiers sans itérer ses enfants, sous Linux. Le plus proche que je l'ai trouvé à ce jour utilise ftw et l'arrêt au premier sous-dossier - ou en utilisant scandir et filtrer à travers les résultats. Les deux, sont, cependant, un surpuissant pour mes besoins, je veux simplement un oui / non.

Sous Windows, cela se fait en appelant SHGetFileInfo et tester ensuite dwAttributes & SFGAO_HASSUBFOLDER sur la structure retournée. Y at-il une telle option sur Linux?

Était-ce utile?

La solution

La réponse standard est d'appeler stat sur le répertoire, puis vérifiez la st_nlink champ ( « nombre de liens »). Sur un système de fichiers standard, chaque répertoire est garanti d'avoir 2 liens durs (. et le lien à partir du répertoire parent dans le répertoire courant), de sorte que chaque lien dur au-delà de 2 indique un sous-répertoire (lien spécifique, .. du sous-répertoire dans le répertoire courant) .

Cependant, je crois savoir que les systèmes de fichiers ne sont pas tenus de mettre en œuvre ce (voir, par exemple, cette annonce la liste de diffusion ), il est donc pas garanti.

Dans le cas contraire, vous devez faire ce que vous faites:

  1. itérer sur le contenu du répertoire en utilisant glob avec le drapeau de GLOB_ONLYDIR GNU spécifique, ou scandir ou readdir .
  2. stat sur chaque résultat et vérifier S_ISDIR(s.st_mode) pour vérifier que les fichiers trouvés sont des répertoires . Ou, nonportably, vérifiez struct dirent.d_type. Si elle est DT_DIR alors il est un fichier, et si elle est DT_UNKNOWN, vous devrez lui stat après tout

Autres conseils

Les possibilités que vous avez mentionnés (ainsi que celle des e.James) me semblent comme ils sont mieux adaptés à un script shell qu'un programme C ++. Présumant l'étiquette « C ++ » était intentionnel, je pense que vous seriez probablement mieux d'utiliser l'API Posix directement:

// 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 voulez-vous le voulez faire? Je pense qu'il shoudl revenir rien s'il n'y a pas de répertoires. J'aurais essayé moi-même mais je suis temporairement sans accès à une boîte de linux :(

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top