web-dev-qa-db-fra.com

C moyen plus rapide de vérifier si un répertoire existe

J'utilise la fonction opendir pour vérifier si un répertoire existe. Le problème est que je l'utilise sur une boucle massive et que cela gonfle le bélier utilisé par mon application.

Quel est le meilleur moyen (le plus rapide) de vérifier si un répertoire existe en C? Quel est le meilleur moyen (le plus rapide) de le créer s'il n'existe pas?

20
Frederico Schardong

Vous pouvez appeler mkdir(). Si le répertoire n'existe pas, il sera créé et 0 sera renvoyé. Si le répertoire existe, -1 sera retourné et errno sera défini sur EEXIST.

17
ckruse

Pensez à utiliser stat . S_ISDIR(s.st_mode) vous dira s'il s'agit d'un répertoire.

Échantillon:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

...
struct stat s;
int err = stat("/path/to/possible_dir", &s);
if(-1 == err) {
    if(ENOENT == errno) {
        /* does not exist */
    } else {
        perror("stat");
        exit(1);
    }
} else {
    if(S_ISDIR(s.st_mode)) {
        /* it's a dir */
    } else {
        /* exists but is no dir */
    }
}
...
41
Johannes Weiss

Je préfère utiliser access()

if (0 != access("/path/to/possible_dir/", F_OK)) {
  if (ENOENT == errno) {
     // does not exist
  }
  if (ENOTDIR == errno) {
     // not a directory
  }
}

Si vous assurez un / final dans le nom du répertoire, cela fonctionne parfaitement.

16
To1ne

J'utiliserais stat(), si disponible.

2
unwind

On dirait que vous avez une fuite de mémoire. L'appel d'opendir ne doit pas gonfler la RAM de votre application, aussi longtemps que vous vous rappelez d'appeler toujours closedir après l'ouverture d'un répertoire. Assurez-vous également que vous libérez tous les tampons que vous avez alloués pour calculer le nom du répertoire.

0
David Grayson