J'essaie de simuler linux commande ls en utilisant linux api de c. En regardant le code, cela a du sens, mais quand je l'exécute, j'obtiens une erreur "stat: pas de fichier ou de répertoire". J'ai vérifié qu'opendir fonctionne bien. Je pense que le problème est dans stat, qui retourne -1 même si je pense qu'il devrait retourner 0.Liste des répertoires sous Linux à partir de C
Qu'est-ce qui me manque?
Merci pour votre aide.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[])
{
DIR *dirp;
struct dirent *direntp;
struct stat stat_buf;
char *str;
if (argc != 2)
{
fprintf(stderr, "Usage: %s dir_name\n", argv[0]);
exit(1);
}
if ((dirp = opendir(argv[1])) == NULL)
{
perror(argv[1]);
exit(2);
}
while ((direntp = readdir(dirp)) != NULL)
{
if (stat(direntp->d_name, &stat_buf)==-1)
{
perror("stat ERROR");
exit(3);
}
if (S_ISREG(stat_buf.st_mode)) str = "regular";
else if (S_ISDIR(stat_buf.st_mode)) str = "directory";
else str = "other";
printf("%-25s - %s\n", direntp->d_name, str);
}
closedir(dirp);
exit(0);
}
Pourquoi ne pas utiliser snprintf au lieu de strcpy? –
@Thomas, pour deux raisons. Premièrement, je peux rapporter les erreurs avec plus de précision, d'autre part ma méthode est un peu plus efficace. – Omnifarious
Je comprends votre point de vue, mais je ne pense pas que le gain minime en efficacité est plus important que la lisibilité du code ici. De plus, la manipulation manuelle des chaînes ajoute toujours un risque d'introduction d'un bug. plus de lignes de code -> plus de bugs ... –