话不多说 上代码:
/*************************************************************************
> File Name: ls-l.c
> Author:
> Mail:
> Created Time: Wed 08 Mar 2017 05:32:08 AM PST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<dirent.h>
#include<pwd.h>
#include<grp.h>
#include<string.h>
#include<time.h>
#include<sys/stat.h>
// a a/b a/c cur:a
// ls a:b,c
// ls b:XXX
// ls a/b:d
// cd a; ls b:d
void printtype(int mode)
{
if(S_ISREG(mode)) putchar('-');
else if(S_ISDIR(mode)) putchar('d');
else if(S_ISLNK(mode)) putchar('l');
else if(S_ISFIFO(mode)) putchar('p');
else if(S_ISSOCK(mode)) putchar('s');
else if(S_ISCHR(mode)) putchar('c');
else if(S_ISBLK(mode)) putchar('b');
else putchar('@');
}
void printaccess(int mode)
{//rwxrwxrwx
const char* acc ="rwx";
int i;
for(i = 0;i<9;i++,mode<<=1)//mode = mode<<1
putchar(mode&0400?acc[i%3]:'-');
}
void showdetail(const char* name)
{
struct stat s;
lstat(name,&s);
printtype(s.st_mode);//打印类型
printaccess(s.st_mode&0777);//打印权限
printf("%2d",s.st_nlink);
printf("%7s",getpwuid(s.st_uid)->pw_name);
printf("%7s",getgrgid(s.st_gid)->gr_name);
printf("%5lu",s.st_size);
char buff[20];
strftime(buff,sizeof(buff),"%F %T",localtime(&s.st_mtime));
printf("%20s %s\n",buff,name);
}
void listDetial(void)
{
DIR* p =opendir(".");//已经设为当前目录,打开即可
if(NULL==p)
{
perror("opendir");
return;
}
struct dirent* q=NULL;
while((q=readdir(p))!=NULL)
{
if(q->d_name[0]=='.') continue;
//列出详细信息
showdetail(q->d_name);
}
}
int main(int argc,char* argv[])
{
if(argc>2)
{
printf("%s [目录路径]\n",argv[0]);
return 0;
}
if(argc==2)//命令行带了目录路径
{
if( chdir(argv[1])==-1)//设为当前目录
{
perror("错误");
return -1;
}
}
listDetial();//列出相信信息
}