手把手教你如何打印出文件或目录的详细信息(超细版)

#include <stdio.h>   // 标准输入输出库
#include <sys/stat.h> // 提供文件状态信息的结构和宏定义
#include <sys/types.h> // 提供系统数据类型定义
#include <unistd.h> // 提供标准符号常量和类型定义
#include <errno.h> // 提供错误码定义
#include <pwd.h> // 提供用户信息结构和函数
#include <grp.h> // 提供组信息结构和函数
#include <time.h> // 提供时间相关函数
#include <string.h> // 提供字符串操作函数

int main(int argc, const char *argv[])
{
    // 检查命令行参数数量是否正确
    if (argc != 2)
    {
        printf("Usage: %s <filename>\n", argv[0]); // 提示正确用法
        return -1;
    }

    struct stat st; // 定义一个结构体变量,用于存储文件状态信息
    if (lstat(argv[1], &st) < 0) // 使用 lstat 获取文件状态信息
    {
        perror("stat fail"); // 如果失败,打印错误信息
        return -1;
    }

    // 打印文件类型和权限信息
    printf("  File: %s\n", argv[1]); // 打印文件名
    printf("  Size: %ld\tBlocks: %ld\tIO Block: %ld\t", st.st_size, st.st_blocks, st.st_blksize); // 打印文件大小、块数和块大小

    char type = 0; // 定义文件类型变量
    switch (st.st_mode & S_IFMT) // 判断文件类型
    {
        case S_IFSOCK:
            type = 's';
            printf("socket file\n");
            break;
        case S_IFLNK:
            type = 'l';
            printf("symlink file\n");
            break;
        case S_IFREG:
            type = '-';
            printf("regular file\n");
            break;
        case S_IFBLK:
            type = 'b';
            printf("block file\n");
            break;
        case S_IFDIR:
            type = 'd';
            printf("directory file\n");
            break;
        case S_IFCHR:
            type = 'c';
            printf("character file\n");
            break;
        case S_IFIFO:
            type = 'p';
            printf("pipe file\n");
            break;
    }

    // 打印设备号、inode号和链接数
    printf("Device: %ld\tInode: %ld\tLinks: %ld\n", st.st_dev, st.st_ino, st.st_nlink);

    // 打印文件权限信息
    printf("Access: (%#o/%c", st.st_mode & 0777, type); // 打印权限的八进制表示和文件类型

    // 打印用户权限
    (st.st_mode & S_IRUSR) ? putchar('r') : putchar('-');
    (st.st_mode & S_IWUSR) ? putchar('w') : putchar('-');
    (st.st_mode & S_IXUSR) ? putchar('x') : putchar('-');

    // 打印组权限
    (st.st_mode & S_IRGRP) ? putchar('r') : putchar('-');
    (st.st_mode & S_IWGRP) ? putchar('w') : putchar('-');
    (st.st_mode & S_IXGRP) ? putchar('x') : putchar('-');

    // 打印其他用户权限
    (st.st_mode & S_IROTH) ? putchar('r') : putchar('-');
    (st.st_mode & S_IWOTH) ? putchar('w') : putchar('-');
    (st.st_mode & S_IXOTH) ? putchar('x') : putchar('-');
    putchar(')'); // 结束权限字符串
    printf("\t");

    // 打印用户和组信息
    printf("Uid: (%d / %s)\t", st.st_uid, getpwuid(st.st_uid)->pw_name); // 打印用户ID和用户名
    printf("Gid: (%d / %s)\n", st.st_gid, getgrgid(st.st_gid)->gr_name); // 打印组ID和组名

    // 打印时间信息
    struct tm *ptm = localtime(&st.st_atime); // 获取访问时间
    printf("Access: %04d-%02d-%02d  %02d:%02d:%02d \n", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);

    ptm = localtime(&st.st_mtime); // 获取修改时间
    printf("Modify: %04d-%02d-%02d  %02d:%02d:%02d \n", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);

    ptm = localtime(&st.st_ctime); // 获取状态更改时间
    printf("Change: %04d-%02d-%02d  %02d:%02d:%02d \n", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);

    return 0;
}

  1. 输入检查

    • 程序接受一个命令行参数(文件名),如果参数数量不正确,提示用户正确用法。

  2. 获取文件状态信息

    • 使用 lstat 函数获取文件的状态信息,存储在 struct stat 结构体中。

  3. 文件类型和权限信息

    • 判断文件类型(普通文件、目录、符号链接等)并打印。

    • 打印文件权限(用户、组和其他用户的读、写、执行权限)。

  4. 文件基本信息

    • 打印文件大小、块数、块大小、设备号、inode号和链接数。

  5. 用户和组信息

    • 使用 getpwuidgetgrgid 函数获取文件所有者和所属组的名称,并打印用户ID、组ID和对应的名称。

  6. 时间信息

    • 打印文件的访问时间、修改时间和状态更改时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值