编程实现“ls -l 文件名”功能

目录

题目

思想

代码


题目

编程实现“ls -l 文件名”功能

思想

  1. 首先定义了一个 struct stat 类型的变量 st ,用于存储文件的状态信息。

  2. 检查通过 stat 函数获取指定文件(argv[1])的状态信息是否成功。如果获取失败(返回值小于 0 ),通过 perror 输出错误信息并返回 -1 结束程序。

  3. 使用 switch 语句根据文件的类型标志(st.st_mode & S_IFMT)来确定文件的类型,并打印相应的字符表示:

    • S_IFBLK 表示块设备文件,打印 b 。
    • S_IFCHR 表示字符设备文件,打印 c 。
    • S_IFDIR 表示目录文件,打印 d 。
    • S_IFIFO 表示命名管道文件,打印 p 。
    • S_IFLNK 表示符号链接文件,打印 l 。
    • S_IFREG 表示普通文件,打印 - 。
    • 对于未知类型,打印 unknown? 。
  4. 接下来分别判断文件的权限位,包括所有者、所属组和其他用户的读、写、执行权限,并打印相应的字符 r 、 w 或 - 。

  5. 打印文件的硬链接数 st.st_nlink 。

  6. 通过 getpwuid 函数获取文件所有者的用户名并打印。

  7. 通过 getgrgid 函数获取文件所属组的组名并打印。

  8. 打印文件的大小 st.st_size 。

  9. 打印文件的最后修改时间,通过 ctime 函数将时间转换为字符串,并进行一定的偏移和截取处理。

  10. 最后打印文件名 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;
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值