【C语言】获取文件属性

目录

1. stat函数

2. 获取文件属性

3. 获取文件权限


 

1. stat函数

int stat(const char *path, struct stat *buf);
功能:获取文件属性
参数:  path:文件路径名buf:保存文件属性信息的结构体
返回值:成功:0失败:-1struct 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;
}

2. 获取文件属性

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;
}

3. 获取文件权限

#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');elseputchar('-');if (st.st_mode & S_IWUSR)putchar('w');elseputchar('-');if (st.st_mode & S_IXUSR)putchar('x');elseputchar('-');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;
}

3. 编程实现“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");elseprintf("-");if (st.st_mode & S_IWUSR)printf("w");elseprintf("-");if ((st.st_mode & S_IXUSR))printf("x");elseprintf("-");//小组权限if (st.st_mode & S_IRGRP)printf("r");elseprintf("-");if (st.st_mode & S_IWGRP)printf("w");elseprintf("-");if ((st.st_mode & S_IXGRP))printf("x");elseprintf("-");//其他人权限if (st.st_mode & S_IROTH)printf("r");elseprintf("-");if (st.st_mode & S_IWOTH)printf("w");elseprintf("-");if ((st.st_mode & S_IXOTH))printf("x");elseprintf("-");//链接数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返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot

springboot排出tomcat服务器&#xff0c;当成spring容器使用 springboot-mybatis springboot-mybatisplus 整合druid

【算法】将单链表按值划分

问&#xff1a; 将单链表按某值划分成左边小、中间相等、右边大的形式 答&#xff1a; 笔试&#xff1a;初始化一个Node类型的数组&#xff0c;对数组进行partition&#xff0c;然后把数组中的节点元素串成链表 public static Node listPartition1(Node head, int pivot) {…

图解Git——分支的新建与合并《Pro Git》

⭐分支的新建与合并 先引入一个实际开发的工作流&#xff1a; 开发某个网站。为实现某个新的需求&#xff0c;创建一个分支。在这个分支上开展工作。 正在此时&#xff0c;你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理&#xff1a; 切换到你…

Web前端界面开发

前沿&#xff1a;介绍自适应和响应式布局 自适应布局&#xff1a;-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果&#xff0c;随着我们的屏幕大小而发生适配的效果&#xff08;类似等比例&#xff09; 如&#xff1a;rem适配 和 vw/vh适配 …

解决:ubuntu22.04中IsaacGymEnv保存视频报错的问题

1. IsaacGymEnvs项目介绍 IsaacGymEnvs&#xff1a;基于NVIDIA Isaac Gym的高效机器人训练环境 IsaacGymEnvs 是一个基于 NVIDIA Isaac Gym 的开源 Python 环境库&#xff0c;专为机器人训练提供高效的仿真环境。Isaac Gym 是由 NVIDIA 开发的一个高性能物理仿真引擎&#xf…

服务器数据恢复—raid5故障导致上层ORACLE无法启动的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器上的8块硬盘组建了一组raid5磁盘阵列。上层安装windows server操作系统&#xff0c;部署了oracle数据库。 raid5阵列中有2块硬盘的硬盘指示灯显示异常报警。服务器操作系统无法启动&#xff0c;ORACLE数据库也无法启动。 服…

MySQL批量修改数据表编码及字符集为utf8mb4

​​​​​​MySQL批量修改数据表编码及字符集为utf8mb4 utf8mb4编码是utf8编码的超集&#xff0c;兼容utf8&#xff0c;并且能存储4字节的表情字符。 采用utf8mb4编码的好处是&#xff1a;存储与获取数据的时候&#xff0c;不用再考虑表情字符的编码与解码问题。 更改数据库…

Day05-后端Web基础——TomcatServletHTTP协议SpringBootWeb入门

目录 Web基础知识课程内容1. Tomcat1.1 简介1.2 基本使用1.2.1 下载1.2.2 安装与卸载1.2.3 启动与关闭1.2.4 常见问题 2. Servlet2.1 快速入门2.1.1 什么是Servlet2.1.2 入门程序2.1.3 注意事项 2.2 执行流程 3. HTTP协议3.1 HTTP-概述3.1.1 介绍3.1.2 特点 3.2 HTTP-请求协议3…

python-42-使用selenium-wire爬取微信公众号下的所有文章列表

文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…

Android SDK下载安装(图文详解)

安装完sdk&#xff0c;就可以直接使用adb命令了&#xff0c;我们做app自动化测试&#xff0c;也需要sdk环境的依赖。 1. 下载Android SDK 网盘下载地址&#xff1a;https://pan.quark.cn/s/8398e52cefc9 官网下载地址&#xff1a;https://www.androiddevtools.cn/ &#xff08;…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

51单片机入门基础

目录 一、基础知识储备 &#xff08;一&#xff09;了解51单片机的基本概念 &#xff08;二&#xff09;掌握数字电路基础 &#xff08;三&#xff09;学习C语言编程基础 二、开发环境搭建 &#xff08;一&#xff09;硬件准备 &#xff08;二&#xff09;软件准备 三、…

LeetCode-493. Reverse Pairs

目录 题目描述 解题思路 【C】 【Java】 https://leetcode.com/problems/reverse-pairs/description/https://leetcode.com/problems/reverse-pairs/description/ 题目描述 Given an integer array nums, return the number of reverse pairs in the array. A reverse pai…

【Python】数据容器:列表,元组,字符串,集合字典及通用操作

文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组&#xff0c;使用广播信道 特点&#xff1a; 覆盖范围有限&#xff1a;通常局限在几千米范围内&#xff0c;比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高&#xff1a;一般能达到 10Mbps…

Qt WORD/PDF(五)使用Json一键填充Word表格

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: 《Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作》 《Qt WORD/PDF&#…

Elasticsearch入门学习

Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…

spring cloud的核心模块有哪些

Spring Cloud 的核心模块就像一套精心设计的工具箱&#xff0c;每个模块都扮演着特定的角色&#xff0c;共同构建起微服务架构的坚实基础。 1. Spring Cloud Netflix&#xff08;部分组件已迁移或弃用&#xff0c;但仍是理解 Spring Cloud 的重要参考&#xff09;&#xff1a; …

Linux创建server服务器实现多方信息收发

一&#xff0c;服务端 1.创建socket套接字&#xff0c;用于网络通信&#xff0c;同一台机器上的进程也可以通过本地套接字进行通信 //1.socket s_fd socket(AF_INET,SOCK_STREAM,0); if(s_fd -1){ perror("socket"); exit(-1); } //server address s_addr.sin_fami…

工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理

哈喽~这里是维小帮&#xff0c;提供多个场所的定位管理方案&#xff0c;如需获取工厂人员定位管理系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中&#xff0c;我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…