仿写ls -li 获取某一个路径下的所有文件的文件属性(不用管文件创建者和属组,也不要隐藏文件)

1》stat: 查看一个文件的属性

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);

形参:pathname  文件名

statbuf:获取到的文件属性存放的位置

返回值:成功返回0,失败返回-1

struct stat {

dev_t  st_dev; /*如果是设备,返回文件使用的设备号,否则为 0*/

ino_t   st_ino; /* 索引节点号 (i节点)*/

mode_t  st_mode; /* 文件类型,权限 */

nlink_t   st_nlink; /* 文件的硬连接数,如果是目录文件,表示一级子目录个数 */

uid_t    st_uid; /* 所有者用户识别号*/

gid_t   st_gid; /* 组识别号 */

dev_t   st_rdev; /* 设备类型*/

off_t   st_size; /* 文件大小,字节表示 */

blksize_t    st_blksize; /*  系统每次按块Io操作时块的大小(一般是512或1024)*/

blkcnt_t   st_blocks; /*块的索引号 */

time_t    st_atime; /* 最后访问时间,如read*/

time_t    st_mtime; /* 最后修改时间*/

time_t    st_ctime; /* 创建时间 */

};

st_mode  & 下面的宏  !=0  说明有该权限

2》lstat:

int lstat(const char *pathname, struct stat *statbuf);

形参:pathname  文件名

statbuf:获取到的文件属性存放的位置

如果当前文件是链接文件,stat获取的是链接文件原文件的属性;

如果当前文件是链接文件,lstat获取的是链接文件(l),自己的属性;

#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "string.h"
#include <dirent.h>
#include "time.h"
char Fun(mode_t ch);
char *Func(mode_t ch);
int main(int argc,char *argv[])
{
    struct dirent *q;
    struct stat p;
    char path[128] = {0};
    time_t t = time(NULL);
    struct tm *w = localtime(&t);
    if(argc < 2)
    {
        strcpy(path,".");
    }
    else
    {
        strcpy(path,argv[1]);
    }
    DIR *dir = opendir(path);
    if(dir == NULL)
    {
        perror("opendir");
        return -1;
    }
    while(q = readdir(dir))
    {
        if(q->d_name[0] == '.')
            continue;
        printf("%ld ",q->d_ino);
        
        int a = lstat(q->d_name,&p);
        if(a == -1)
        {
            perror("lstat");
            return -1;
        }
        printf("%c%s ",Fun(p.st_mode),Func(p.st_mode));
        printf("%ld %ld ",p.st_nlink,p.st_size);

        printf("%d月 %d ",w->tm_mon+1,w->tm_mday);
        printf("%d:%d ",w->tm_hour,w->tm_min);
        printf("%s\n",q->d_name);
    }
   // printf("\n");
    closedir(dir);
    return 0;
}

char Fun(mode_t ch)
{
    char a = 0;
    switch (ch & S_IFMT) 
    {
        case S_IFBLK: a = 'b';break;
        case S_IFCHR: a = 'c';break;
        case S_IFDIR: a = 'd'; break;
        case S_IFIFO: a = 'p';break;
        case S_IFLNK: a = 'l';break;
        case S_IFREG: a = '-';break;
        case S_IFSOCK:a = 's';break;
    }
    return a;
}

char *Func(mode_t ch)
{
    static char buf[10] = {0};
    strcpy(buf,"---------");
    if(ch & S_IRUSR)
    {
        buf[0] = 'r';
    }
    if(ch & S_IWUSR)
    {
        buf[1] = 'w';
    }
    if(ch & S_IXUSR)
    {
        buf[2] = 'x';
    }

    if(ch & S_IRGRP)
    {
        buf[3] = 'r';
    }
    if(ch & S_IWGRP)
    {
        buf[4] = 'w';
    }
    if(ch & S_IXGRP)
    {
        buf[5] = 'x';
    }

    if(ch & S_IROTH)
    {
        buf[6] = 'r';
    }
    if(ch & S_IWOTH)
    {
        buf[7] = 'w';
    }
    if(ch & S_IXOTH)
    {
        buf[8] = 'x';
    }
    return buf;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、vtk相机类vtkCamera的使用

在三维渲染场景中,相机好比观众的眼睛,人站立的位置影响事物的大小,视角的不同影响看到事物的范围,目光的朝向影响看到事物的正反。 vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。 下图为相机投影示意图: 相机位置:即相机所在的位置,用方法vtkCamera::Se…

C/C++ - 类的封装特性

目录 类的封装 语法格式 声明定义 分文件 访问权限 类作用域 对象模型 构造函数 默认构造函数 带参构造函数 拷贝构造函数 构造函数重载 委托构造函数 初始数据列表 构造默认参数 构造函数删除 析构函数 析构函数概念 析构函数特性 析构函数示例 析构调用…

QEMU源码全解析41 —— Machine(11)

接前一篇文章&#xff1a;QEMU源码全解析40 —— Machine&#xff08;10&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 时间过去了几…

Redis实现多种限流算法

一 常见限流算法 1 固定窗口限流 每一个时间段计数器&#xff0c;当计数器达到阈值后拒绝&#xff0c;每过完这个时间段&#xff0c;计数器重置0&#xff0c;重新计数。 优点&#xff1a;实现简单&#xff0c;性能高&#xff1b; 缺点&#xff1a;明显的临界问题&#xff0c…

2024.1.25 C++QT 作业

思维导图 练习题 1. 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void sh…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态&#xff1a; channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…

图文解析交流慢充原理和握手协议以及OBC工作原理

1.接口定义 2.硬件连接原理 2.obc工作原理 OBC里面包括单片机1和单片机2&#xff0c;DSP。 有的厂家方案只有一个单片机&#xff0c;CC/CP部分直接用DSP实现。交流桩的ARM控制K1、K2&#xff0c;S1。单片机1控制K3。单片机2控制S2。DSP控制K4。BMS控制PDU里面的K5&#x…

算法分析(概论)

目录 第一章 概论 1.算法的概念 1.定义 2.算法设计要求 3.算法的特性 4.算法描述 5.数据结构与算法 6.算法设计的基本步骤 2.算法分析 1.计算机资源 2.算法分析 3.评判算法效率的方法 4.算法时间复杂度分析 5.渐进符号 1.大Ο符号 2.大Ω符号 3.大Θ符号 4.三…

Allure 内置特性

章节目录&#xff1a; 一、内置特性概述二、展示环境信息三、测试结果分类四、用例步骤说明五、添加附件六、添加用例描述七、设置动态的用例标题八、报告中添加链接九、组织测试结果9.1 使用与理解9.2 指定运行 十、划分用例级别十一、动态生成附加信息十二、清空历史报告记录…

Cesium反向遮罩指定区域挖空---Primitive、PolygonGeometry、PolylineGeometry实现

PolylineRegionalExcavationFun2() {import("./data/安徽省.json").then((res) => {console.log(`res`, res);let features = res.features;let positionArray = [];let borderLinePositionArray = [];// 获取区域的经纬度坐标if (features[0]?.geometry?.coord…

【大数据】Flink 中的状态管理

Flink 中的状态管理 1.算子状态2.键值分区状态3.状态后端4.有状态算子的扩缩容4.1 带有键值分区状态的算子4.2 带有算子列表状态的算子4.3 带有算子联合列表状态的算子4.4 带有算子广播状态的算子 在前面的博客中我们指出&#xff0c;大部分的流式应用都是有状态的。很多算子都…

【陈工笔记-Transformer】Transformer的基础认识

对Transformer生动形象的比喻 Transformer包括了Encoder和Decoder&#xff0c;在知乎上看到了对两个部分关系的一种理解&#xff0c;非常有趣。即&#xff0c;“一个人学习跳舞&#xff0c;Encoder是看别人是如何跳舞的&#xff0c;Decoder是将学习到的经验和记忆&#xff0c;…

被动信息搜集

被动信息搜集主要通过搜索引擎或者社交等方式对目标资产信息进行提取&#xff0c; 通常包括IP查询、Whois查询、子域名搜集等。进行被动信息搜集时不与目标产 生交互&#xff0c;可以在不接触到目标系统的情况下挖掘目标信息。主要方法包括&#xff1a;DNS 解析、子域名挖掘、…

Unity中创建Ultraleap 3Di交互项目

首先&#xff0c;创建新的场景 1、创建一个空物体&#xff0c;重命名为【XP Leap Provider Manager】&#xff0c;并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下&#xff0c;创建两个子物体Service Provider(XR)和Service Provider(…

随机点名--好玩哦

大屏滚动&#xff0c;随机点名&#xff0c;可刺激哦 想屏幕名字滚动得快一点&#xff0c;sleep时间就小一点 效果图 代码 #!/bin/bash namefile"/opt/name.txt" linenum$(sed -n $ $namefile) while : docleartmp$(sed -n "$[RANDOM%linenum1]p" $namefi…

文件上传之大文件分块上传

原则&#xff1a;合久必分&#xff0c;分久必合 优势部分&#xff1a;减少了内存占用&#xff0c;可实现断点续传&#xff0c;并发处理&#xff0c;利用带宽&#xff0c;提高效率 不足之处&#xff1a;增加复杂性&#xff0c;增加额外计算存储 应用场景&#xff1a;云存储大文件…

Springboot的 Lombok全部关联注解以及核心注解@Data详解

目录 工具安装 依赖注入 注解类别 1. Getter / Setter 2. ToString 3. EqualsAndHashCode 4. NoArgsConstructor / RequiredArgsConstructor / AllArgsConstructor 5. Data 示例 注意事项 6. Value 7. Builder 8. Slf4j / Log / Log4j / Log4j2 / XSlf4j 9. NonN…

03.领域驱动设计:了解实体和值对象以及它们的区别

目录 1、概述 2、实体 1.实体的业务形态 2.实体的代码形态 3.实体的运行形态 4.实体的数据库形态 3、值对象 1.值对象的业务形态 2.值对象的代码形态 3.值对象的运行形态 4.值对象的数据库形态 5.值对象的优势和局限 4、实体和值对象的区别 5、总结 1、概述 DDD战…

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit3.0勒索病毒解密处理流程

对于企业来说&#xff0c;企业的数据是企业的核心命脉&#xff0c;关乎着企业的生产与运营的所有工作。随着网络技术的不断发展&#xff0c;网络安全威胁也在不断增加。近期&#xff0c;云天数据恢复中心接到了很多企业的求助&#xff0c;企业的虚拟机服务器遭到了lockbit3.0勒…

vue的pinia环境搭建

一、 pinia是什么&#xff1f; Pinia是Vue的新一代轻量级状态管理库&#xff0c;它允许您跨组件/页面共享状态。Pinia由Vue.js官方成员重新设计&#xff0c;旨在提供更直观、更易于学习的状态管理解决方案。 Pinia的主要特点包括&#xff1a; 对Vue2和Vue3提供良好的支持&#…