stat函数——(ll +代码)

说明

代码

#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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值