首页 > 编程语言 >编程实现“ls -l 文件名”功能

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

时间:2024-09-01 20:23:17浏览次数:11  
标签:include 文件名 编程 st break mode printf else ls

目录

题目

思想

代码


题目

编程实现“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;
}

标签:include,文件名,编程,st,break,mode,printf,else,ls
From: https://blog.csdn.net/QR70892/article/details/141789313

相关文章

  • 基于元神操作系统编程写USB扇区
    1.背景本文介绍了“调用元神操作系统API向U盘扇区写数据”的程序实现及测试结果。2.方法(1)调用元神操作系统API读U盘扇区本部分内容已在前面的文章中进行介绍,详细内容请参考“编写程序调用元神操作系统的API”。(2)调用元神操作系统API写U盘扇区本例通过调用系统API来向U......
  • 如何用GPT进行编程辅助?
    随着人工智能技术的迅速发展,GPT(生成型预训练模型)已成为开发者的得力助手之一。无论是编写代码、调试、生成文档,还是解决编程问题,GPT都能提供显著帮助。这篇教程将详细介绍如何使用GPT进行编程辅助,并提供具体的操作步骤和案例。一、为什么选择GPT进行编程辅助?1.快速生成代......
  • webUtils
    importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;publicclassWebUtils{/***将字符串渲染到客户端**@paramresponse渲染对象*@paramstring待渲染的字符串*/publicstaticvoidre......
  • 章10——面向对象编程(高级部分)——类名类方法
    类变量/静态(static)变量/静态属性特点:由该类的全体对象实例共享,该变量只占同一块内存空间。其标志是关键字static修饰。在类加载的时候便生成了。类加载的时机如下图:publicstaticintcount=0;类变量可以由类名来访问。System.out.println("共有"+Child.count+"......
  • ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题
    接前一篇文章:ESP32-C3在MQTT访问时出现“Lasterrorcodereportedfromesp-tls:0x8001”和问题的分析(2)上一回讲解了所遇问题log中的“esp-tls:couldn'tgethostnamefor:iot-emqx-pre.nanshe-tech.com:getaddrinfo()returns202,addrinfo=0x0”,再来回顾一下。这一......
  • 【编程底层思考】线程阻塞时一定会释放cpu吗
    线程阻塞时是否释放CPU取决于阻塞的原因和操作系统的行为。以下是一些具体情况:1.阻塞等待资源:当线程因为等待某个资源(如锁、信号量、条件变量等)而阻塞时,它通常会释放CPU,以便其他线程可以运行。在这种情况下,阻塞的线程不会占用CPU资源,直到它等待的资源变得可用。2.阻塞等......
  • VirtualSurveyor9.2.0 无人机摄影测量数据处理软件
    VirtualSurveyor9.2中文版是功能强大的无人机测绘软件,使用旨在为用户提供完整的地理空间数据可视化和分析功能,带来提高的生产力,功能全面而强大,在无人机到CAD模型的过程中,使用VirtualSurveyor软件来拆卸输送机、测量体积并绘制断裂线!从您的无人机数据高效地创建调查,创建测量,表......
  • 20240908_030339 编程剪辑 读取音频对像获得音频时长
    需求有一个目录里存放了多个音频文件我们要获取这些音频文件的相关信息编写一个方法接收音频文件的目录返回音频信息列表示例......
  • Java 入门指南:Java 并发编程 —— AQS、AQLS、AOS 锁与同步器的框架
    AQSAQS是AbstractQueuedSynchronizer的缩写,即抽象队列同步器,是Java.util.concurrent中的一个基础工具类,用于实现同步器(Synchronizer)的开发。AQS提供了一种实现锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器,使得开发者能够更方便地编写线程安全的......
  • 正点原子Linux C应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动
    正点原子LinuxC应用编程:移植tslib并使其适配7寸LCD1024*600的GT911触摸驱动作者在学习【正点原子】I.MX6U嵌入式LinuxC应用编程指南V1.4时,发现移植tslib后,触摸事件触发不正常。使用的硬件版本:正点原子I.MX6UALPHAV2.4版本底板,LCD:正点原子7寸1024*600,型号ATK-MD0700R-102460......