Listar arquivos e diretórios com suas propriedades

Publicado por Raphael Silva do Nascimento (última atualização em 08/12/2010)

[ Hits: 11.753 ]

Download status.c




Criei um programa em C que recebe como parâmetro o nome de um ou mais diretórios e lista todos os arquivos, incluindo todas as propriedades de cada arquivo, como se fosse o comando ls -la.

Foi utilizada a sycall stat sys/stat.h.


  



Esconder código-fonte

/*
  Name: Status.c
  Author: Raphael Silva do Nascimento
  Date: 29/11/10
  Description: script que recebe como parametro o nome de um ou mais diretórios e lista todos os arquivos incluindo todas as propriedades de cada arquivo, como se fosse o comando ls -la. 
*/


#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <locale.h>
#include <langinfo.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <fcntl.h>

int informacaoArquivo(char* );

int main(int argc, char * argv[]){   
   int i;
   if(argc >= 2){
      for(i=1; i<argc; i++){
         printf("\n---------------------------%s--------------------------\n\n",argv[i]);
         informacaoArquivo(argv[i]);
      }
   }else{
      printf("\n");      
      informacaoArquivo(".");      
   }
   printf("\n\n");      
   return;
}


int informacaoArquivo(char *url)
{
   struct dirent     *dp;
   struct stat          statbuf;
   struct passwd     *pwd;
   struct group      *grp;
   struct tm         *tm;
   char                  datestring[256];
   DIR              *dir;
   char                  * accesses[] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
   ushort       mode;
   int              i=0;

   dir = opendir(url);
   if (dir==NULL){
      perror("Erro ao abrir diretorio");
      return;
   }
   
   /* Loop atraves da entrada do diretorio */ 
   while (dp = readdir(dir)) {
       

       /* Obter informaçoes de entrada */ 
       stat(dp->d_name, &statbuf);      
       
       /* Print o tipo de arquivo */
       if(S_ISREG(statbuf.st_mode)) { printf("-"); } //Arquivo regular
       if(S_ISDIR(statbuf.st_mode)) { printf("d"); } //Diretorio
       if(S_ISCHR(statbuf.st_mode)) { printf("c"); } //Dispositivo de caracter
       if(S_ISLNK(statbuf.st_mode)) { printf("l"); } //Link
       if(S_ISSOCK(statbuf.st_mode)) { printf("s"); }//Arquivo Socket
       
       /* Print a permissão.*/
       for(i = 6; i >= 0; i -=3)
               printf("%s", accesses[(statbuf.st_mode >> i) & 7]);
       
       /* Print o numero de link */
       mode = statbuf.st_nlink;
       printf(" %d", mode);

            
       /* Print o nome do criador se for achado usando getpwuid().*/ 
       if ((pwd = getpwuid(statbuf.st_uid)) != NULL)
      printf(" %-8.8s", pwd->pw_name);
       else
      printf(" %-8d", statbuf.st_uid);


       /* Print nome do grupo se for achado usando getgrgid().*/ 
       if ((grp = getgrgid(statbuf.st_gid)) != NULL)
      printf(" %-8.8s", grp->gr_name);
       else
      printf(" %-8d", statbuf.st_gid);


       /* Print tamanho do arquivo.*/ 
       printf(" %jd", (intmax_t)statbuf.st_size);


       tm = localtime(&statbuf.st_mtime);
       

       /* Obter data em estring. */
       strftime(datestring, sizeof(datestring), nl_langinfo(D_T_FMT), tm);


       printf(" %s %s\n", datestring, dp->d_name);  


   }

   close(dir);
}

Scripts recomendados

Exemplo de manipulação de arquivos

Agenda eletrônica completa em C

Codigo para criar arquivo de log

Ler config

Editar o arquivo /etc/rc.d/rc.local


  

Comentários
[1] Comentário enviado por foxbit3r em 09/12/2010 - 11:32h

Ficou muito bom. Parabéns

[2] Comentário enviado por f_Candido em 11/12/2010 - 15:06h

Muito bom, Parabéns.

Abraços

[3] Comentário enviado por leoberbert em 12/03/2012 - 16:44h

Muito bom!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts