Linux获取文件属性

目录

stat函数

获取文件属性

获取文件权限

实现“head -n 文件名”命令的功能

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

stat/fstat/lstat的区别?


stat函数

int stat(const char *path, struct stat *buf);
功能:获取文件属性
参数:  path:文件路径名
       buf:保存文件属性信息的结构体
返回值:成功:0
      失败:-1
    struct stat {
        ino_t     st_ino;     /* inode号 ls -il */     
        mode_t    st_mode;    /* 文件类型和权限 */
        nlink_t   st_nlink;   /* 硬链接数 */
        uid_t     st_uid;     /* 用户ID */
        gid_t     st_gid;     /* 组ID */
        off_t     st_size;    /* 大小 */
        time_t    st_atime;   /* 最后访问时间 */
        time_t    st_mtime;   /* 最后修改时间 */
        time_t    st_ctime;   /* 最后状态改变时间 */
    };

打印inode号,链接数,大小:

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    struct stat st;
    if(stat("a.c",&st)<0)
    {
        perror("stat err");
        return -1;
    }

    printf("inode:%lu nlink:%d size:%ld\n",st.st_ino,st.st_nlink,
    st.st_size);

    return 0;
}

获取文件属性

S_IFMT是一个掩码,它的值是0170000(注意这里用的是八进制前缀为0,二进制为0b1111000000000000), 可以用来过滤出四位表示的文件类型

例如:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    struct stat st;
    if (stat(".", &st) < 0)
    {
        perror("stat err");
        return -1;
    }

    printf("inode:%lu nlink:%d size:%ld\n", st.st_ino, st.st_nlink,
           st.st_size);
    printf("%#o\n", st.st_mode);
    
    //判断文件类型
    if ((st.st_mode & __S_IFMT) == __S_IFREG)
        printf("regular file\n");
    else if ((st.st_mode & __S_IFMT) == __S_IFDIR)
        printf("directory\n");

    //或者用宏函数
    if (S_ISREG(st.st_mode))
        printf("-");
    else if (S_ISDIR(st.st_mode))
        printf("d");

    return 0;
}

获取文件权限

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    struct stat st;
    if (stat(".", &st) < 0)
    {
        perror("stat err");
        return -1;
    }

    printf("inode:%lu nlink:%d size:%ld\n", st.st_ino, st.st_nlink,
           st.st_size);
    printf("%#o\n", st.st_mode);

    //判断文件权限
    //个人权限
    if (st.st_mode & S_IRUSR)
        putchar('r');
    else
        putchar('-');

    if (st.st_mode & S_IWUSR)
        putchar('w');
    else
        putchar('-');

    if (st.st_mode & S_IXUSR)
        putchar('x');
    else
        putchar('-');

    return 0;
}

实现“head -n 文件名”命令的功能

例:head -3 test.c -> ./a.out -3 test.c

atoi : "1234" -- 1234

思路:1. 打开文件 2. 获取到行数 3.循环读,读到内容判断\n则n++,打印。4. 直到n为行数则停止

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    FILE *fp;
    int num, n = 0;
    char buf[32] = "";
    if (argc != 3)
    {
        printf("Usage: %s -n <file>\n", argv[0]);
        return -1;
    }
    fp = fopen(argv[2], "r");
    if (fp == NULL)
    {
        perror("fopen err");
        return -1;
    }
    num = atoi(argv[1] + 1); //./a.out -3 a.c,+1是为了去掉-
    if (num == 0)            //判断-0的情况
        return 0;
    while (fgets(buf, 32, fp)) //或者fgets(buf,32,fp)!=NULL
    {
        //如果最后一个是换行则,行数加一。
        if (buf[strlen(buf) - 1] == '\n')
            n++;
        //先打印,之后如果达到所记录行数则终止循环。
        printf("%s", buf);
        if (num == n)
            break;
    }
    fclose(fp);
    return 0;
}

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

getpwuid

getgrgid

localtime或ctime

ctime函数在C库中,头文件为<time.h>

函数原型:

char *ctime (const time_t *__timer)

作用:返回一个表示当地时间的字符串,当地时间是基于参数 timer

格式例如: Wed Aug 29 19:48:54 2018

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.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_IFREG:
            printf("-");
            break;
        case S_IFDIR:
            printf("d");
            break;
        case S_IFCHR:
            printf("c");
            break;
        case S_IFIFO:
            printf("f");
            break;
        case S_IFLNK:
            printf("l");
            break;
        case S_IFBLK:
            printf("b");
            break;
        case S_IFSOCK:
            printf("s");
            break;
        default:
            printf("mode err\n");
            break;
    }

    //判断文件权限
    //个人权限
    if (st.st_mode & S_IRUSR)
        printf("r");
    else
        printf("-");
    if (st.st_mode & S_IWUSR)
        printf("w");
    else
        printf("-");
    if ((st.st_mode & S_IXUSR))
        printf("x");
    else
        printf("-");

    //小组权限
    if (st.st_mode & S_IRGRP)
        printf("r");
    else
        printf("-");
    if (st.st_mode & S_IWGRP)
        printf("w");
    else
        printf("-");
    if ((st.st_mode & S_IXGRP))
        printf("x");
    else
        printf("-");
    //其他人权限
    if (st.st_mode & S_IROTH)
        printf("r");
    else
        printf("-");
    if (st.st_mode & S_IWOTH)
        printf("w");
    else
        printf("-");
    if ((st.st_mode & S_IXOTH))
        printf("x");
    else
        printf("-");

    //链接数
    printf(" %d",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个地址), .12是为了只打印12个字符
    //名字
    printf(" %s\n",argv[1]);
    return 0;
}

stat/fstat/lstat的区别?

stat函数返回一个与此命名文件有关的信息结构

fstat函数获得已在描述符filedes上打开的文件的有关信息,也就是参数是文件描述符,其他与stat相同。

lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息.

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

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

相关文章

容器运行应用及Docker命令

文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型&#xff1f;socket有哪些类型&#xff1f; 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手&#xff08;非常详细&#xff09; socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达&#xff08;Mac&#xff09; 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…

4.5 TCP 报文段的首部格式

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 TCP 报文段的基本结构2 固定部分2.1 源端口与目的端口2.2 序号2.3 确认号2.4 数据偏移2.5 保留字段2.6 控制位2.7 窗口2.8 检验和2.9 紧急指针 3 可变部分3.1 选项3.2 填…

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变&#xff08;Radial Distortion&a…

线程条件变量 生产者消费者模型 Linux环境 C语言实现

只能用来解决同步问题&#xff0c;且不能独立使用&#xff0c;必须配合互斥锁一起用 头文件&#xff1a;#include <pthread.h> 类型&#xff1a;pthread_cond_t PTHREAD_COND_INITIALIZER 初始化 初始化&#xff1a;int pthread_cond_init(pthread_cond_t * cond, NULL);…

Springboot美食分享平台

私信我获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 Springboot美食分享平台 一、 绪论 1.1 研究意义 当今社会作为一个飞速的发展社会&#xff0c;网络已经完全渗入人们的生活&#xff0c; 网络信息已成为传播的第一大媒介&#xff0c; 可以毫不夸张…

爬虫(JAVA笔记第四十期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 正则表达式爬虫 正则表达式 正则表达式可以用来校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性&#xff1b;也可以在一段文本中查找满足要求的内容 单字符…

【实战教程】小目标检测利器:使用YOLOv8和SAHI进行视频检测,检测效果真心不错

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount

目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …

【机器学习】—Transformers的扩展应用:从NLP到多领域突破

好久不见&#xff01;喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 &#xff08;一&#xff09;、核心组件 &#xff08;二&#xff09;、架构图 二、领域扩展&#xff1a;从NLP到更多场景 1. 自然语言处理&#xff08;NLP&#xff09; 2…

AMEYA360 | 杭晶电子:晶振在AR/VR中的应用

晶振在AR/VR设备中扮演重要角色&#xff0c;为其核心电子系统提供稳定的时钟信号&#xff0c;确保设备的高性能运行。 以下是晶振在AR/VR应用中的具体作用&#xff1a; 01、图像处理与同步 1、晶振为图形处理单元(GPU)和显示芯片提供精准的时钟信号&#xff0c;支持高速图像渲染…

肝硬化腹水的症状表现

‌肝硬化腹水的症状表现多样‌&#xff1a; ‌全身症状‌ 疲倦乏力&#xff0c;体力明显下降。 皮肤干枯粗糙&#xff0c;面色灰暗黝黑&#xff0c;有时可见黄疸。 双下肢浮肿&#xff0c;甚至出现蜘蛛痣、肝掌等体征‌ ‌消化道症状‌ 食欲减退&#xff0c;常伴有恶心、呕…

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析

当电脑提示“mfc140u.dll丢失”时&#xff0c;这可能会导致某些程序无法正常运行&#xff0c;给用户带来不便。不过&#xff0c;有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题&#xff0c;教大家有效解决mfc140u.dll丢失。 判断是否是“mf…

汽车IVI中控开发入门及进阶(三十六):QML调用蓝牙sdk的架构

Qt/QML本身在做GUI界面工程时,除了各种界面上的按钮、图片、工具条等元素之外,最方便的就是可以通过C++实现界面各种复杂逻辑,而实现上不可避免就需要一些外部库的支持,不管是静态库.a还是动态库.so,比如蓝牙模块。 而QML/C++启动一个蓝牙协议栈SDK作为一个进程,然后启动…

【SARL】单智能体强化学习(Single-Agent Reinforcement Learning)《纲要》

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

ES常见问题汇总

ES常见问题汇总 1.Es的作用&#xff08;elasticsearch&#xff09; 作用&#xff1a; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈 elasticsearch结合kibana、Logstash&…

C# 动态类型 Dynamic

文章目录 前言1. 什么是 Dynamic&#xff1f;2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…

【08】MySQL复杂查询:子查询语句详解与示例

文章目录 一、子查询的基本概念子查询的基本结构子查询的类型 二、标量子查询示例 1&#xff1a;标量子查询示例 2&#xff1a;标量子查询与IN组合 三、多行子查询示例 1&#xff1a;多行子查询与IN示例 2&#xff1a;多行子查询与ANY 四、多列子查询示例 1&#xff1a;多列子查…

ApiPost调试问题

在使用ApiPost调试接口时&#xff0c;发现传参老是传不过去&#xff0c;最后发现json格式中开头需要小写(哪怕后端名称是大写)