1、要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
//将文件权限转化为字符'rwx-'
void file_chmod(mode_t m)
{
int i;
for(i=0;i<9;i++)
{
if((m & (0400>>i)) ==0)
{
putchar('-');
continue;
}
switch(i)
{
case 0:
case 3:
case 6:
putchar('r');
break;
case 1:
case 4:
case 7:
putchar('w');
break;
case 2:
case 5:
case 8:
putchar('x');
break;
}
}
}
//将文件类型转化为字符'bcd-lsp'
void file_typee(mode_t m)
{
switch(m&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');
break;
}
}
//将用户UID转化为ubuntu字符形式
void file_username(uid_t uid)
{
struct passwd * pwd=getpwuid(uid);
if(NULL==pwd)
{
perror("pwd");
return ;
}
printf("%s ",pwd->pw_name);
}
//将用户组ID转化为字符形式
void file_groupname(gid_t gid)
{
struct group * grp=getgrgid(gid);
if(NULL==grp)
{
perror("grp");
return ;
}
printf("%s ",grp->gr_name);
}
//将时间戳转化为"年月日,时分"形式
void file_time(time_t t)
{
struct tm *lp=localtime(&t);
if(NULL==lp)
{
perror("time");
return;
}
printf(" %-d-%2d-%2d %2d:%2d ",\
lp->tm_year+1900,lp->tm_mon+1,lp->tm_mday,\
lp->tm_hour,lp->tm_min);
}
int main(int argc, const char *argv[])
{
//打开目录文件
DIR *dp=opendir("./");
if(NULL==dp)
{
perror("opendir");
return -1;
}
//读取目录文件
while(1)
{
struct dirent *pp=readdir(dp);
if(NULL==pp)
{
if(errno==0)
{
printf("目录读取结束\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
/* if((pp->d_name)[0]!='.')
{
printf("%s\n",pp->d_name);//输出目录中的文件
}
*/
struct stat buf;//申请空间
//将输出的文件路径传入打印文件属性的结构体中
int ret=stat(pp->d_name,&buf);
if(ret<0)
{
perror("stat");
return -1;
}
//文件类型及权限
file_typee(buf.st_mode);
file_chmod(buf.st_mode);
//硬链接
printf(" %ld ",buf.st_nlink);
//UID
file_username(buf.st_uid);
//GID
file_groupname(buf.st_gid);
//文件大小
printf("%5ld",buf.st_size);
//时间戳
time_t m=buf.st_ctime;
file_time(m);
//文件名
printf("%s\n",pp->d_name);
}
//关闭目录文件
if(closedir(dp)<0)
{
perror("closedir");
return -1;
}
return 0;
}
ubuntu@ubuntu:opendir$ gcc opendir.c
ubuntu@ubuntu:opendir$ ./a.out
drwxrwxr-x 4 ubuntu ubuntu 4096 2022-10-10 18:19 ..
-rw-rw-r-- 1 ubuntu ubuntu 0 2022-10-10 19:12 2.c
-rwxrwxr-x 1 ubuntu ubuntu 13192 2022-10-10 19:46 a.out
-rw-rw-r-- 1 ubuntu ubuntu 0 2022-10-10 18:19 1.c
drwxrwxr-x 4 ubuntu ubuntu 4096 2022-10-10 19:46 .
-rw-rw-r-- 1 ubuntu ubuntu 0 2022-10-10 18:19 .1
drwxrwxr-x 2 ubuntu ubuntu 4096 2022-10-10 18:19 666
drwxrwxr-x 2 ubuntu ubuntu 4096 2022-10-10 18:19 857
-rw-rw-r-- 1 ubuntu ubuntu 2787 2022-10-10 19: 8 opendir.c
目录读取结束
ubuntu@ubuntu:opendir$ ls -al
总用量 36
drwxrwxr-x 4 ubuntu ubuntu 4096 十月 10 19:46 .
drwxrwxr-x 4 ubuntu ubuntu 4096 十月 10 18:19 ..
-rw-rw-r-- 1 ubuntu ubuntu 0 十月 10 18:19 .1
-rw-rw-r-- 1 ubuntu ubuntu 0 十月 10 18:19 1.c
-rw-rw-r-- 1 ubuntu ubuntu 0 十月 10 19:12 2.c
drwxrwxr-x 2 ubuntu ubuntu 4096 十月 10 18:19 666
drwxrwxr-x 2 ubuntu ubuntu 4096 十月 10 18:19 857
-rwxrwxr-x 1 ubuntu ubuntu 13192 十月 10 19:46 a.out
-rw-rw-r-- 1 ubuntu ubuntu 2787 十月 10 19:08 opendir.c