web-dev-qa-db-fra.com

Vérifier si un fichier est un répertoire ou juste un fichier

J'écris un programme pour vérifier si quelque chose est un fichier ou un répertoire. Y a-t-il une meilleure façon de le faire que cela?

#include <stdio.h>

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int isFile(const char* name)
{
    DIR* directory = opendir(name);

    if(directory != NULL)
    {
     closedir(directory);
     return 0;
    }

    if(errno == ENOTDIR)
    {
     return 1;
    }

    return -1;
}

int main(void)
{
    const char* file = "./testFile";
    const char* directory = "./";

    printf("Is %s a file? %s.\n", file,
     ((isFile(file) == 1) ? "Yes" : "No"));

    printf("Is %s a directory? %s.\n", directory,
     ((isFile(directory) == 0) ? "Yes" : "No"));

    return 0;
}
23
Jookia

Vous pouvez appeler la fonction stat () et utiliser la macro S_ISREG() dans le champ st_mode de la structure stat afin de déterminer si votre chemin d'accès pointe vers un fichier normal:

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

int is_regular_file(const char *path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISREG(path_stat.st_mode);
}

Notez qu'il existe d'autres types de fichiers que regular et directory, tels que des périphériques, des canaux, des liens symboliques, des sockets, etc. Vous pouvez en tenir compte.

47
Frédéric Hamidi

Utilisez le S_ISDIRmacro:

int isDirectory(const char *path) {
   struct stat statbuf;
   if (stat(path, &statbuf) != 0)
       return 0;
   return S_ISDIR(statbuf.st_mode);
}
17
ismail

Oui, il y a mieux. Vérifiez la fonction stat ou fstat

4
KARASZI István

Normalement, vous voulez effectuer cette vérification de manière atomique en utilisant le résultat. Ainsi, stat() est inutile. Au lieu de cela, open() le fichier en lecture seule d’abord et utilisez fstat() . Si c'est un répertoire, vous pouvez alors utiliser fdopendir() pour le lire. Ou vous pouvez essayer de l’ouvrir pour commencer à écrire, et l’ouverture échouera s’il s’agit d’un répertoire. Certains systèmes (POSIX 2008, Linux) ont également une extension O_DIRECTORY à open qui fait échouer l'appel si le nom n'est pas un répertoire.

Votre méthode avec opendir() est également bonne si vous voulez un répertoire, mais vous ne devriez pas le fermer après; vous devriez aller de l'avant et l'utiliser.

1
R..