Coder le commande ls -l en C - C - Programmation
Marsh Posté le 16-11-2012 à 16:43:48
Mouais, erreur de débutant : les noms de fichier que tu récupères dans la structure "dirent" ne contiennent pas le nom du dossier passé à opendir(). Donc la fonction stat() ne fonctionnera que lorsque tu scanne le répertoire courrant.
Marsh Posté le 16-11-2012 à 16:50:13
tpierron a écrit : Mouais, erreur de débutant : les noms de fichier que tu récupères dans la structure "dirent" ne contiennent pas le nom du dossier passé à opendir(). Donc la fonction stat() ne fonctionnera que lorsque tu scanne le répertoire courrant. |
Merci pour ton intervention, mais ça te dérange de me faire un petit exemple stp ??
Ce serait plus claire dans ma tete !
Vous entendez quoi par scanner le repertoire courant ??
Marsh Posté le 16-11-2012 à 16:13:47
Bonjour tout le monde, j'ai sollicite vraiment votre aide.
En effet je dois coder la commande ls -l, mon code compile bien et quand je l'exécute en lui passant aucun parametre,
il parcours alors le repertoire courant ("." ) et me retourne bien le resultat.
Par contre quand je lui passe 1 ou plusieurs repertoire en parametre, j'ai une erreur au niveau de la commande STAT.
Vous pouvez exécuter le code pour voir.
J'ai beau essayé mais j'arrive pas à avancer ,alors voici mon code : (je pense que mon erreur se trouve au niveau des lignes que j'ai coloré en rouge) ... merci d'avance à vous ohh sauveurs !!!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#define couleur(param) fprintf(stderr,"\b \033[%sm",param)
void affiche_status (char * nom)
{
struct stat status;
struct passwd *pwd;
struct group *grp;
DIR * ptdir;
if(stat(nom,& status) >= 0)
{
if(strncmp(nom, "..", 2) != 0 && strncmp(nom, ".", 1) != 0)
{
if(S_ISBLK(status.st_mode))
fprintf(stderr, "b" );
else if(S_ISCHR(status.st_mode))
fprintf(stderr, "c" );
else if(S_ISDIR(status.st_mode))
fprintf(stderr, "d" );
else if(S_ISFIFO(status.st_mode))
fprintf(stderr, "p" );
else if(S_ISLNK(status.st_mode))
fprintf(stderr, "l" );
else if(S_ISREG(status.st_mode))
fprintf(stderr, "-" );
else if(S_ISSOCK(status.st_mode))
fprintf(stderr, "s" );
fprintf(stderr, status.st_mode & S_IRUSR ? "r" : "-" );
fprintf(stderr, status.st_mode & S_IWUSR ? "w" : "-" );
fprintf(stderr, status.st_mode & S_IXUSR ? "x" : "-" );
fprintf(stderr, status.st_mode & S_IRGRP ? "r" : "-" );
fprintf(stderr, status.st_mode & S_IWGRP ? "w" : "-" );
fprintf(stderr, status.st_mode & S_IXGRP ? "x" : "-" );
fprintf(stderr, status.st_mode & S_IROTH ? "r" : "-" );
fprintf(stderr, status.st_mode & S_IWOTH ? "w" : "-" );
fprintf(stderr, status.st_mode & S_IXOTH ? "x" : "-" );
fprintf(stderr,"\t%ld",status.st_nlink);
if ((pwd = getpwuid(status.st_uid)) != NULL)
fprintf(stderr,"\t%s", pwd->pw_name);
if ((grp = getgrgid(status.st_gid)) != NULL)
fprintf(stderr,"\t%s", grp->gr_name);
fprintf(stderr,"\t%lu",status.st_size);
fflush(stdin);
fprintf(stderr,"\t%-24.24s\t",ctime(&status.st_mtime));
fflush(stdin);
if((ptdir=opendir(nom)) != NULL) { couleur("34" ); fprintf(stderr,"%s\n",nom);couleur("0" ); }
else if(S_ISREG(status.st_mode ) && status.st_mode & 0111 ){ couleur("32" ); fprintf(stderr,"%s\n",nom);couleur("0" ); } /* ((status.st_mode & S_IFMT) != S_IFREG) : .exe */
else fprintf(stderr,"%s\n",nom);
}
}
else perror("STAT" );
}
int main (int argc, char * argv[])
{
DIR * ptdir;
struct dirent * entree;
int i;
if(argc==1)
{
if ((ptdir = opendir("." )) != NULL)
{
while ((entree = readdir (ptdir)) != NULL)
{
affiche_status(entree->d_name);
}
}
}
else
{
for(i=1;i<argc; i++)
{
if ((ptdir = opendir(argv[i])) != NULL)
{
fprintf(stderr,"%s :\n",argv[i]);
while ((entree = readdir (ptdir)) != NULL)
{
affiche_status(entree->d_name);
}
}
}
}
closedir(ptdir);
return 0;
}