2009-06-24 6 views

Répondre

35

Le code suivant utilise la fonction stat() et les macros S_ISDIR ('est un répertoire') et S_ISREG ('est un fichier normal') pour obtenir des informations sur le fichier. Le reste est juste une vérification d'erreur et assez pour faire un programme compilable complet.

#include <stdio.h> 
#include <errno.h> 
#include <sys/stat.h> 

int main (int argc, char *argv[]) { 
    int status; 
    struct stat st_buf; 

    // Ensure argument passed. 

    if (argc != 2) { 
     printf ("Usage: progName <fileSpec>\n"); 
     printf ("  where <fileSpec> is the file to check.\n"); 
     return 1; 
    } 

    // Get the status of the file system object. 

    status = stat (argv[1], &st_buf); 
    if (status != 0) { 
     printf ("Error, errno = %d\n", errno); 
     return 1; 
    } 

    // Tell us what it is then exit. 

    if (S_ISREG (st_buf.st_mode)) { 
     printf ("%s is a regular file.\n", argv[1]); 
    } 
    if (S_ISDIR (st_buf.st_mode)) { 
     printf ("%s is a directory.\n", argv[1]); 
    } 

    return 0; 
} 

runs exemples sont présentés ici:


pax> vi progName.c ; gcc -o progName progName.c ; ./progName 
Usage: progName 
     where is the file to check. 

pax> ./progName /home 
/home is a directory. 

pax> ./progName .profile 
.profile is a regular file. 

pax> ./progName /no_such_file 
Error, errno = 2 
+0

votre code est un peu lourd en raison de la vérification des erreurs. Je suggère de supprimer ceci et d'ajouter un commentaire comme "vérifier les erreurs: le fichier n'existe pas, pas assez d'arguments". Je pense que ça va rendre votre réponse un peu meilleure –

+3

Je la préfère avec la vérification des erreurs, car elle est souvent laissée de côté et les gens ne savent pas nécessairement comment la remettre. –

+1

Je l'ai laissé, mais clarifié dans le texte ce que sont les bits importants. – paxdiablo

9

Utilisez l'appel système stat (2). Vous pouvez utiliser la macro S_ISREG ou S_ISDIR dans le champ st_mode pour voir si le chemin donné est un fichier ou un répertoire. La page de manuel vous indique tous les autres champs.

-1

Vous pouvez également utiliser la fonction system() avec dans la commande du shell "test".
système retourne l'état de sortie de la dernière commande exécutée

 
string test1 = "test -e filename" ; 
if(!system(test1)) 
printf("filename exists") ; 

string test2 = "test -d filename" ; 
if(!system(test2)) 
    printf("filename is a directory") ; 

string test3 = "test -f filename" ; 
if(!system(test3)) 
    printf("filename is a normal file") ; 

mais je crains que cela ne peut fonctionner que sur linux ..

+2

Problématique si le nom de fichier contient des espaces, je pense que vous devriez y échapper. – Paggas

+3

Bien que cela fonctionne, la performance laissera beaucoup à désirer. Chaque appel à system() va bifurquer et ensuite exec un nouveau shell pour interpréter la commande. –

5

Qu'est-ce que sur l'utilisation du boost :: bibliothèque de système de fichiers et son is_directory (const chemin & p)? Cela peut prendre du temps pour se familiariser avec, mais pas tellement. Cela vaut probablement la peine d'investir, et votre code ne sera pas spécifique à la plate-forme.

Questions connexes