Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1890 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Coder le commande ls -l en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Coder le commande ls -l en C

n°2164337
baboye11
l'entre-aide avant tout.
Posté le 16-11-2012 à 16:13:47  profilanswer
 

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;
}

mood
Publicité
Posté le 16-11-2012 à 16:13:47  profilanswer
 

n°2164339
tpierron
Posté le 16-11-2012 à 16:43:48  profilanswer
 

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.

n°2164340
baboye11
l'entre-aide avant tout.
Posté le 16-11-2012 à 16:50:13  profilanswer
 

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 ??


Message édité par baboye11 le 16-11-2012 à 16:53:16

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Coder le commande ls -l en C

 

Sujets relatifs
[Divers]ligne de commandeSockets en C
[C] PIC18F2580 problème sortie inversée[C] Fonction gotoligcol
[C/Reseau] Protocole FTP/ mode passif/ LIST&GETWordpress : coder une adresse mail
programme C :jeu de cartesProgramme C++ , erreur ? Ou ça ?
[C] Conversion type énuméré en string pour affichage :programme C
Plus de sujets relatifs à : Coder le commande ls -l en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR