#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <unistd.h>
int a_flag = 0;
int l_flag = 0;
int display_file(const char *path)
{
struct stat f_info;
struct tm *ptm;
if(lstat(path,&f_info) < 0)
{
perror("Fail to stat");
return -1;
}
//文件类型
switch(f_info.st_mode & S_IFMT)
{
case S_IFSOCK:
putchar('s');
break;
case S_IFLNK:
putchar('l');
break;
case S_IFREG:
putchar('-');
break;
case S_IFBLK:
putchar('b');
break;
case S_IFDIR:
putchar('d');
break;
case S_IFCHR:
putchar('c');
break;
case S_IFIFO:
putchar('p');
}
//权限
if(f_info.st_mode & S_IRUSR)
{
putchar('r');
}else{
putchar('-');
}
if(f_info.st_mode & S_IWUSR)
{
putchar('w');
}else{
putchar('-');
}
if(f_info.st_mode & S_IXUSR)
{
putchar('x');
}else{
putchar('-');
}
if(f_info.st_mode & S_IRGRP)
{
putchar('r');
}else{
putchar('-');
}
if(f_info.st_mode & S_IWGRP)
{
putchar('w');
}else{
putchar('-');
}
if(f_info.st_mode & S_IXGRP)
{
putchar('x');
}else{
putchar('-');
}
if(f_info.st_mode & S_IROTH)
{
putchar('r');
}else{
putchar('-');
}
if(f_info.st_mode & S_IWOTH)
{
putchar('w');
}else{
putchar('-');
}
if(f_info.st_mode & S_IXOTH)
{
putchar('x');
}else{
putchar('-');
}
putchar(' ');
printf("%d",f_info.st_nlink);
putchar(' ');
printf("%s",getpwuid(f_info.st_uid)->pw_name);
putchar(' ');
printf("%s",getgrgid(f_info.st_gid)->gr_name);
putchar(' ');
printf("%ld",f_info.st_size);
printf(" ");
ptm = localtime(&f_info.st_mtime);
fprintf(stdout,"%d-%d-%d %d:%d:%d ",ptm->tm_year + 1900,ptm->tm_mon + 1,\
ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
///home/linux/test.c
//test.c
char *p = (char *)(path + strlen(path) - 1);
while(*p != '/' && p != path) p --;
if(p == path)
printf("%s\n",path);
else
printf("%s\n",p + 1);
return 0;
}
// /home/linux/
int display_dir(const char *name)
{
DIR *pdir;
struct dirent *pdirent;
int file_count = 0,dir_count = 0;
char path_name[1024];
if((pdir = opendir(name)) == NULL)
{
fprintf(stderr,"Fail to opendir %s : %s.\n",name,strerror(errno));
return -1;
}
while( pdirent = readdir(pdir) )
{
if(pdirent->d_name[0] == '.' && a_flag != 1)
continue;
if(name[strlen(name) - 1] == '/')
{
sprintf(path_name,"%s%s",name,pdirent->d_name);
}else{
sprintf(path_name,"%s/%s",name,pdirent->d_name);
}
if(l_flag == 1)
{
display_file(path_name);
}else{
printf("%s ",pdirent->d_name);
}
}
return 0;
}
//./a.out -a
//./a.out -l
//./a.out -l file
//./a.out -l dir
int main(int argc, char * const argv[])
{
int i = 0;
int ch;
struct stat f_info;
/*处理命令行参数*/
while((ch = getopt(argc,argv,"al")) != -1)
{
switch(ch)
{
case 'a':
a_flag = 1;
break;
case 'l':
l_flag = 1;
break;
default:
printf("Invalid option character.\n");
return -1;
}
}
if(argc == optind)
{
display_dir(".");
}else{
for(i = optind;i < argc;i++)
{
if(stat(argv[i],&f_info) < 0)
{
perror("Fail to stat");
return -1;
}
if(S_ISDIR(f_info.st_mode))
{
display_dir(argv[i]);
}else{
if(l_flag == 1)
display_file(argv[i]);
else
printf("%s ",argv[i]);
}
}
}
printf("\n");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int a_flag = 0;
int l_flag = 0;
//./a.out -a -l -g
int main(int argc, char * const argv[])
{
int ch;
while( (ch = getopt(argc,argv,"al")) != -1)
{
switch(ch)
{
case 'a':
a_flag = 1;
break;
case 'l':
l_flag = 1;
break;
default:
printf("%c.\n",ch);
break;
}
}
printf("argc = %d optind = %d.\n",argc,optind);
return 0;
}