Étant donné un chemin, disons,/home/shree/path/def, je voudrais déterminer si def est un répertoire ou un fichier. Y a-t-il un moyen d'atteindre ceci en code C ou C++?Différencier un répertoire unix et un fichier en C et C++
Répondre
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
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.
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 ..
Problématique si le nom de fichier contient des espaces, je pense que vous devriez y échapper. – Paggas
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. –
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.
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 –
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. –
Je l'ai laissé, mais clarifié dans le texte ce que sont les bits importants. – paxdiablo