/*DIR/LS CMD UTILITY por Daniel Salvador aka sportingdan - MEFT08*/
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
typedef struct
{
char *sname;
unsigned long int tam;
long int dat;
unsigned char foldertest;
} ficheiro;
int
compare (const void *info1, const void *info2)
{
ficheiro **arch1 = (ficheiro**) info1;
ficheiro **arch2 = (ficheiro**) info2;
char *name1 = (*arch1)->sname;
char *name2 = (*arch2)->sname;
return strcasecmp(name1, name2);
}
void
show_help (int status)
{
printf ("\n_-^*+DIR/LS CMD UTILITY(\?!)+*^-_\n");
printf ("\n*AJUDA*\n");
printf ("\n-Para obter listagem de objectos da pasta onde\n se encontra");
printf (" o programa:\n > prog\n");
printf ("\n-Para obter listagem detalhada de objectos da pasta onde\n");
printf (" se encontra o programa:\n > prog -l\n");
printf ("\n-Para obter listagem de objectos de outra pasta:\n");
printf (" > prog <localizacao directorio>\n");
printf ("\n-Para obter listagem detalhada de objectos de outra pasta:\n");
printf (" > prog -l <localizacao directorio>\n");
printf ("\n-Para mostrar esta informacao: prog -help\n\n");
printf("NOTA: Se a localizacao da pasta contiver espacos,\n");
printf("entao e necessario incluir aspas. Exemplo:\n");
printf(">prog -l \"<localizacao directorio>\"\n\n");
exit (status);
}
int
main(int argc, char **argv)
{
DIR *dfile,*dtest;
ficheiro **fich;
char *name;
char *chpto=".";
char *ptdir;
int k=0;
int ls=0;
int num,t;
struct dirent *info_dir;
struct stat info_file;
struct tm *ptr_tm;
char mtime[50];
if(argc==1)
ptdir=chpto;
else if(argc==2)
{
if(strcmp(argv[1],"-l")!=0 && strcmp(argv[1],"-help")!=0)
ptdir=argv[1];
else if(strcmp(argv[1],"-help")==0)
show_help (1);
else
{
ls=1;
ptdir=chpto;
}
}
else if(argc==3)
{
if(strcmp(argv[1],"-l")!=0)
{
printf("\nERRO! - Opcao invalida.\n");
show_help (-1);
}
ls=1;
ptdir=argv[2];
}
else
{
printf("\nERRO! - Opcao invalida.\n");
show_help (-2);
}
dfile=opendir(ptdir);
if(dfile==0)
{
printf("\nERRO! - Nao foi possivel abrir a pasta especificada.\n");
printf("Por vafor verifique a questao dos espacos!\n");
show_help (-3);
}
while(info_dir=readdir(dfile))
++k;
num=k;
fich=(ficheiro**)malloc(num*sizeof(ficheiro*));
closedir(dfile);
dfile=opendir(ptdir);
k=0;
while(info_dir=readdir(dfile))
{
fich[k]=(ficheiro*)malloc(sizeof(ficheiro));
fich[k]->sname=(char*)malloc((strlen(info_dir->d_name)+1)*sizeof(char));
strcpy(fich[k]->sname,info_dir->d_name);
if(ls==1)
{
t=strlen(ptdir)+strlen(info_dir->d_name)+2;
name=(char*)malloc(t*sizeof(char));
strcpy(name,ptdir);
#ifndef __unix__
strcat(name,"\\");
#else
strcat(name,"/");;
#endif
strcat(name,info_dir->d_name);
#ifndef __unix__
stat(name,&info_file);
#else
lstat(name,&info_file);
#endif
fich[k]->tam=info_file.st_size;
fich[k]->dat=info_file.st_mtime;
dtest=opendir(name);
if(dtest==NULL)
fich[k]->foldertest=0;
else
fich[k]->foldertest=1;
closedir(dtest);
}
++k;
}
qsort(fich,num,sizeof(*fich),compare);
printf("\n_-^*+DIR/LS CMD UTILITY(\?!)+*^-_\n\n");
printf("\n*FOLDER CONTENT\n\n");
for(k=0;k<num;++k)
{
printf("%s\n",fich[k]->sname);
if(ls==1)
{
ptr_tm=localtime(&fich[k]->dat);
strftime(mtime,sizeof(mtime),"%a, %d/%m/%y at %H:%M:%S",ptr_tm);
if(fich[k]->foldertest==0)
printf("Type:File -- Size:%lu bytes",fich[k]->tam);
else
printf("Type:Folder");
printf(" -- Date Modified: %s\n\n",mtime);
}
}
closedir(dfile);
return 0;
}