要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
void get_fileType(mode_t m)
{
if(S_ISREG(m))
putchar('-');
else if(S_ISDIR(m))
putchar('d');
else if(S_ISCHR(m))
putchar('c');
else if(S_ISBLK(m))
putchar('b');
else if(S_ISFIFO(m))
putchar('p');
else if(S_ISLNK(m))
putchar('l');
else if(S_ISSOCK(m))
putchar('s');
}
void get_fliePermission(mode_t m)
{
int i;
for(i=0;i<9;i++)
{
if((m & (0400 >> i)) != 0)
{
if(i%3 == 0)
putchar('r');
else if(i%3 == 1)
putchar('w');
else
putchar('x');
}
else
putchar('-');
}
}
int main(int argc, const char *argv[])
{
DIR* dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
struct dirent* rp = NULL;
char path[300] = "";
while(1)
{
bzero(path, sizeof(path));
rp = readdir(dp);
if(NULL == rp)
{
if(0 == errno)
{
printf("读取到目录结尾\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
/* if('.' == *(rp->d_name))
{
continue;
}
*/
if((argv[1])[strlen(argv[1])-1] == '/')
{
sprintf(path, "%s%s", argv[1], rp->d_name);
}
else
{
sprintf(path, "%s/%s", argv[1], rp->d_name);
}
struct stat buf;
if(stat(path,&buf) < 0)
{
perror("stat");
return -1;
}
// printf("mode:%o\n",buf.st_mode);
get_fileType(buf.st_mode);
get_fliePermission(buf.st_mode);
// putchar(10);
printf(" %ld",buf.st_nlink);
// printf("uid:%d\n",buf.st_uid);
struct passwd* pw = getpwuid(buf.st_uid);
printf(" %s",pw->pw_name);
// printf("gid:%d\n",buf.st_gid);
struct group* gp = getgrgid(buf.st_gid);
printf(" %s",gp->gr_name);
printf(" %6ld",buf.st_size);
struct tm* info = localtime(&(buf.st_atime));
printf(" %2d月 %2d %2d:%2d",info->tm_mon+1,\
info->tm_mday,info->tm_hour,info->tm_min);
printf(" %s\n",rp->d_name);
}
if(closedir(dp) < 0)
{
perror("closedir");
return -1;
}
return 0;
}