É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.
- 1. Dézipper un répertoire en C++
- 2. Ouvrir le fichier dans un autre répertoire en C
- 3. Comment ouvrir un fichier en C# et modifier ses propriétés?
- 4. Comment télécharger et décompresser un fichier sitemap gz dans C#?
- 5. allouer et libérer un char * en C++
- 6. Autorisations de fichier/répertoire C#
- 7. Ouverture d'un fichier sur unix en utilisant C++
- 8. Écrire au fichier binaire en C++ et C#
- 9. Makefile et fichiers sous un répertoire
- 10. fichier virtuel? en c/C++ ou C#
- 11. Modifier l'ordre des fichiers dans un répertoire Windows en C
- 12. En utilisant .htaccess et mod_rewrite dans un répertoire (non root)
- 13. Télécharger un fichier via HTTPS C# - Cookie et Header Prob?
- 14. Comment puis-je changer pour un autre répertoire en C++?
- 15. C#: Vérifier si un fichier n'est pas verrouillé et inscriptible
- 16. C# et fichier texte dans un jeu de données typé
- 17. Comment différencier (en cas de surcharge) entre les formes préfixes et postfixes de l'opérateur ++? (C++)
- 18. programmation Unix ... fork() et execv() aider ... C Programmation
- 19. Compile Construire et fichier c sous Windows
- 20. Comment restaurer un fichier en utilisant C#?
- 21. UNIX Heure système et heure de l'utilisateur. C-Programming
- 22. Comment décomposer le temps unix en C
- 23. Comment vérifier si un fichier existe sur un serveur en utilisant C# et la classe WebClient
- 24. Comment SCP un fichier par programmation en utilisant C
- 25. Comment copier un fichier en C#
- 26. Comment shell exécuter un fichier en C#?
- 27. Comment tronquer un fichier en C?
- 28. Fichier ou répertoire verrouillé dans C
- 29. Fichier liste C# dans le répertoire
- 30. Quel programme crée un tableau C donné à un fichier?
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