目录
题目
编程实现“ls -l 文件名”功能
思想
首先定义了一个
struct stat
类型的变量st
,用于存储文件的状态信息。检查通过
stat
函数获取指定文件(argv[1]
)的状态信息是否成功。如果获取失败(返回值小于 0 ),通过perror
输出错误信息并返回-1
结束程序。使用
switch
语句根据文件的类型标志(st.st_mode & S_IFMT
)来确定文件的类型,并打印相应的字符表示:
S_IFBLK
表示块设备文件,打印b
。S_IFCHR
表示字符设备文件,打印c
。S_IFDIR
表示目录文件,打印d
。S_IFIFO
表示命名管道文件,打印p
。S_IFLNK
表示符号链接文件,打印l
。S_IFREG
表示普通文件,打印-
。- 对于未知类型,打印
unknown?
。接下来分别判断文件的权限位,包括所有者、所属组和其他用户的读、写、执行权限,并打印相应的字符
r
、w
或-
。打印文件的硬链接数
st.st_nlink
。通过
getpwuid
函数获取文件所有者的用户名并打印。通过
getgrgid
函数获取文件所属组的组名并打印。打印文件的大小
st.st_size
。打印文件的最后修改时间,通过
ctime
函数将时间转换为字符串,并进行一定的偏移和截取处理。最后打印文件名
argv[1]
。总的来说,这段代码的目的是获取指定文件的详细状态信息,并以特定的格式打印出来,包括文件类型、权限、链接数、所有者、所属组、大小、修改时间和文件名。
代码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
int main(int argc, char const *argv[])
{
struct stat st;
if (stat(argv[1], &st) < 0)
{
perror("stat err");
return -1;
}
switch (st.st_mode & S_IFMT)
{
case S_IFBLK:
printf("b");
break;
case S_IFCHR:
printf("c");
break;
case S_IFDIR:
printf("d");
break;
case S_IFIFO:
printf("p");
break;
case S_IFLNK:
printf("l");
break;
case S_IFREG:
printf("-");
break;
case S_IFSOCK:
printf("s");
break;
default:
printf("unknown?\n");
break;
}
//判断文件权限
//个人权限
if (st.st_mode & S_IRUSR) //r
printf("r");
else
printf("-");
if (st.st_mode & S_IWUSR) //w
printf("w");
else
printf("-");
if (st.st_mode & S_IXUSR) //x
printf("x");
else
printf("-");
//小组成员
if (st.st_mode & S_IRGRP) //r
printf("r");
else
printf("-");
if (st.st_mode & S_IWGRP) //w
printf("w");
else
printf("-");
if (st.st_mode & S_IXGRP) //x
printf("x");
else
printf("-");
//其他人
//个人权限
if (st.st_mode & S_IROTH) //r
printf("r");
else
printf("-");
if (st.st_mode & S_IWOTH) //w
printf("w");
else
printf("-");
if (st.st_mode & S_IXOTH) //x
printf("x");
else
printf("-");
//链接数
printf(" %ld", st.st_nlink);
//用户名 需要getpwuid()
printf(" %s", getpwuid(st.st_uid)->pw_name);
//组名 需要getgrgid()
printf(" %s", getgrgid(st.st_gid)->gr_name);
//文件大小
printf(" %ld", st.st_size);
//最后修改的时间
printf(" %.12s", ctime(&st.st_mtime) + 4); //+4表示偏移4个地址跳过前4个字符, %.12s表示只打印前12个字符
//文件名
printf(" %s\n", argv[1]);
return 0;
}
标签:include,文件名,编程,st,break,mode,printf,else,ls
From: https://blog.csdn.net/QR70892/article/details/141789313