说明
代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/sysmacros.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
//./stat filename
int main(int argc, const char *argv[])
{
struct stat st;
int retval;
retval = stat(argv[1], &st);
if (retval == -1)
{
perror("获取文件属性失败");
return -1;
}
switch (st.st_mode & S_IFMT)
{
case S_IFSOCK:
printf("s");
break;
case S_IFLNK:
printf("l");
break;
case S_IFREG:
printf("-");
break;
case S_IFBLK:
printf("b");
break;
case S_IFDIR:
printf("d");
break;
case S_IFCHR:
printf("c");
break;
case S_IFIFO:
printf("p");
break;
default:
printf("?");
}
for (int bit = 0400; bit > 0; bit = bit >> 1)
{
switch (st.st_mode & bit)
{
case 0400:
case 0040:
case 0004:
printf("r");
break;
case 0200:
case 0020:
case 0002:
printf("w");
break;
case 0100:
case 0010:
case 0001:
printf("x");
break;
default:
printf("-");
break;
}
}
printf(" %lu", st.st_nlink);
// 使用getpwuid函数根据UID获取用户信息 pw是一个结构体 包含了用户的组id 但是组名不清楚
struct passwd *pw = getpwuid(st.st_uid);
if (pw != NULL)
{
// 如果成功,打印用户名
printf(" %s", pw->pw_name);
}
else
{
printf("???");
}
// 使用getgrgid函数根据GID获取组信息
struct group *grp = getgrgid(st.st_gid);
if (grp != NULL)
{
// 如果成功,打印组名
printf(" %s", grp->gr_name);
}
else
{
// 如果失败,打印错误信息
printf("???");
}
printf(" %lu", st.st_size);
// printf("文件访问时间=%s", ctime((time_t *)&st.st_atim)); //默认带有换行
char buffer[1024] = {0};
char *pos;
sprintf(buffer, " %s", ctime((time_t *)&st.st_mtim));
pos = strstr(buffer, "\n");
*pos = '\0';
printf(" %s", buffer);
printf(" %s\n", argv[1]);
return 0;
}