linux中的目录操作函数

参考

【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构

stat函数

    C标准库提供了访问linux的目录的函数接口现对目录的操作。

一、libc接口

    libc访问目录的流程为:打开目录,访问目录,关闭目录。以及一些操作目录指针位置的函数。

打开目录

DIR *opendir(const char *name);
DIR *fdopendir(int fd);

一个是根据路径名称打开文件,而另一个是根据文件描述符打开目录。

DIR结构体是一个目录流(Directory Stream)的类型定义

struct __dirstream
{void *__fd; /* `struct hurd_fd' pointer for descriptor.   */char *__data; /* Directory block.   */int __entry_data; /* Entry number `__data' corresponds to.   */char *__ptr; /* Current pointer into the block.   */int __entry_ptr; /* Entry number `__ptr' corresponds to.   */size_t __allocation; /* Space allocated for the block.   */size_t __size; /* Total valid data in the block.   */__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};typedef struct __dirstream DIR;

其实到不需要理解每个成员的含义,调用流程就在那。

访问目录

struct dirent *readdir(DIR *dirp);

从目录流中读取一个文件结点信息,成功则返回目录信息,并且dirp指向下个目录进入点.,有错误发生或读取到目录文件尾则返回NULL。这就提供了循环遍历目录的方法。

dirent结构定义

struct dirent {ino_t          d_ino;       /* inode number i节点编号 */off_t          d_off;       /* not an offset; see NOTES 早期文件系统中,telldir返回文件在目录内的偏移 */unsigned short d_reclen;    /* length of this record dirent 记录的实际长度 */unsigned char  d_type;      /* type of file; not supportedby all filesystem types 文件类型 */char           d_name[256]; /* filename 文件名 */
};

其中,d_type的类型有:

  • DT_BLK This is a block device.这是一个块设备。
  • DT_CHR This is a character device.这是一个字符设备。
  • DT_DIR This is a directory.这是一个目录。
  • DT_FIFO This is a named pipe (FIFO).这是一个命名管道(FIFO)。
  • DT_LNK This is a symbolic link.这是一个符号链接。
  • DT_REG This is a regular file.这是一个标准文件。
  • DT_SOCK This is a UNIX domain socket.这是一个Unix域套接字。
  • DT_UNKNOWN The file type is unknown.文件类型未知。

例如循环读取目录下的信息

const char* path = ...
DIR* dirp = opendir(path);
struct dirent *dp;
while ((dp = readdir(dirp)) != NULL) {// 读取、打印文件名、文件类型等信息printf dp->d_name, d_type
}

关闭目录

int closedir(DIR *dirp);

成功返回0, 失败返回-1。

调整目录流位置指针

telldir

long telldir(DIR *dirp);

用于获取当前目录流(Directory Stream)的位置指针。这个位置指针表示你当前遍历到的是该目录下的第几个子目录。就像目录流是一个数组,返回当前位置的索引。

seekdir

void seekdir(DIR *dirp, long loc);

用于设置目录流的位置指针。你可以通过这个函数跳转到指定的子目录。这个函数有点奇怪,为什么返回是void,如果索引超出,是将dirp直接置null吗?

rewinddir

void rewinddir(DIR *dirp);

用于重置目录流的位置指针到流的起始位置。

二、stat函数

    stat函数用于获取文件的信息

int stat(const char *path, struct stat *buf)

struct stat结构体

struct stat
{dev_t     st_dev;     /* ID of device containing file */文件使用的设备号ino_t     st_ino;     /* inode number */    索引节点号 mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等nlink_t   st_nlink;   /* number of hard links */    文件的硬连接数  uid_t     st_uid;     /* user ID of owner */    所有者用户识别号gid_t     st_gid;     /* group ID of owner */   组识别号  dev_t     st_rdev;    /* device ID (if special file) */ 设备文件的设备号off_t     st_size;    /* total size, in bytes */ 以字节为单位的文件容量   blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块  time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间   time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间   time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   
};
st_dev:该字段用于描述此文件所在的设备。不常用,可以不用理会。
st_ino:文件的 inode 编号。
st_mode:该字段用于描述文件的模式,譬如文件类型、文件权限都记录在该变量中。
st_nlink:该字段用于记录文件的硬链接数,也就是为该文件创建了多少个硬链接文件。链接文件可以分为软链接(符号链接)文件和硬链接文件。
st_uid、st_gid:此两个字段分别用于描述文件所有者的用户 ID 以及文件所有者的组 ID。
st_rdev:该字段记录了设备号,设备号只针对于设备文件,包括字符设备文件和块设备文件,不用理会。
st_size:该字段记录了文件的大小(逻辑大小),以字节为单位。
st_atim、st_mtim、st_ctim:此三个字段分别用于记录文件最后被访问的时间、文件内容最后被修改的时间以及文件状态最后被改变的时间,都是 struct timespec 类型变量。

st_mode 变量

1、S_IFMT 0170000 文件类型的位遮罩 
2、S_IFSOCK 0140000 scoket
3、S_IFLNK 0120000 符号连接 
4、S_IFREG 0100000 一般文件 
5、S_IFBLK 0060000 区块设备 
6、S_IFDIR 0040000 目录 
7、S_IFCHR 0020000 字符设备 
8、S_IFIFO 0010000 先进先出 
9、S_ISUID 04000 文件的 (set user-id on execution)位 
10、S_ISGID 02000 文件的 (set group-id on execution)位 
11、S_ISVTX 01000 文件的sticky 位 
12、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限 
13、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限 
14、S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限 
15、S_IRGRP 00040 用户组具可读取权限 
16、S_IWGRP 00020 用户组具可写入权限 
17、S_IXGRP 00010 用户组具可执行权限 
18、S_IROTH 00004 其他用户具可读取权限 
19、S_IWOTH 00002 其他用户具可写入权限 
20、S_IXOTH 00001 其他用户具可执行权限上述的文件类型在 POSIX 中定义了检查这些类型的宏定义 
21、S_ISLNK (st_mode) 是否是一个连接
22、S_ISREG (st_mode) 是否是一个常规文件
23、S_ISDIR (st_mode) 是否是一个目录 
24、S_ISCHR (st_mode) 是否是一个字符设备
25、S_ISBLK (st_mode) 是否是一个块设备
26、S_ISFIFO (st_mode) 是否是一个FIFO文件
27、S_ISSOCK (st_mode) 是否是一个SOCKET文件 
若一目录具有sticky 位 (S_ISVTX), 则表示在此目录下的文件只能 被该文件所有者、此目录所有者或root 来删除或改名.

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

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

相关文章

uniapp 小程序 支付逻辑处理

uniapp 小程序 支付逻辑处理 上代码如果你不需要支付宝适配&#xff0c;可以删除掉支付宝的条件判断代码 <button class"subBtn" :disabled"submiting" click"goPay">去支付</button>// 以下代码你需要改的地方// 1. order/app/v1…

怎样实现大语言模型微调,庞氏骗局智能合约检查,BERT

目录 怎样实现大语言模型微调 一、了解微调的基本概念 二、选择合适的微调方法 三、实施微调的具体步骤 四、注意事项 庞氏骗局智能合约检查 一、使用的大模型 二、微调方法 1. 数据准备 2. 微调策略 3. 微调过程 三、输入和输出 输入 输出 四、注意事项 一、使…

【Linux】centos7安装php7.4

环境说明 本文档在服务器不能连接互联网的情况下&#xff0c;进行安装php7.4及其扩展。 操作系统&#xff1a;centos7.6 架构&#xff1a;X86_64 一、安装依赖&#xff08;可选&#xff09; 说明&#xff1a;服务器能联网就可以通过 yum install 命令下载对应php需要的依赖…

设计模式之策略模式_入门

前言 最近接触了优惠券相关的业务&#xff0c;如果是以前&#xff0c;我第一时间想到的就是if_else开始套&#xff0c;这样的话耦合度太高了&#xff0c;如果后期添加或者删除优惠券&#xff0c;必须直接修改业务代码&#xff0c;不符合开闭原则&#xff0c;这时候就可以选择我…

【TypeScript 一点点教程】

文章目录 一、开发环境搭建二、基本类型2.1 类型声明2.2 基本类型 三、编译3.1 tsc命令3.2 tsconfig.json3.2.1 基本配置项includeexcludeextendsfiles 3.2.2 compilerOptions编译器的配置项 四、面向对象4.1 类4.2 继承4.3 抽象类4.4 接口 一、开发环境搭建 下载Node.js《Nod…

usb pd message结构解析

usb pd 3.1规范定义了三种类型的消息: •简短的控制消息&#xff0c;用于管理端口伙伴之间的消息流或交换不需要额外数据的消息。控制消息的长度为16位。 •用于在一对端口伙伴之间交换信息的数据消息。数据报文的长度范围是48 ~ 240位。 有三种类型的数据消息: ▪那些用于暴露…

【区块链+绿色低碳】双碳数字化管控平台 | FISCO BCOS应用案例

地方政府、园区及企业实现“双碳”目标过程中存在一些挑战与难点&#xff1a; 1. 管理者难以掌握完整、准确、全面的碳排放数据进行科学决策&#xff1a;由于碳排放核算需要对数据的来源、核算方法 的规范性和采集方法的科学性有严格要求&#xff0c;当前面临碳排放数据数据采…

中国一汽发布“一汽●北斗云工作台” 意在推动企业数智化转型

“一汽●北斗云工作台”已经实现100%自主可控&#xff0c;覆盖企业全价值链、全体系、全过程、全岗位的工作需求。目前一汽2.3万个业务单元实现线上作业&#xff0c;产品开发效率提升30%&#xff0c;订单交付周期缩短25%以上。”7月17日&#xff0c;中国第一汽车集团有限公司&a…

智能路面裂缝检测:基于YOLO和深度学习的全流程实现

引言 路面裂缝检测是维护道路质量和延长道路寿命的重要手段。传统的检测方法往往费时费力且易受人为因素影响。为了提高检测效率和准确性&#xff0c;本文介绍了一种基于深度学习的路面裂缝检测系统。该系统包括用户界面&#xff0c;利用YOLO&#xff08;You Only Look Once&a…

Typescript学习笔记(1.0)

1.ts开发环境&#xff1a;先安装Node&#xff0c;然后执行命令npm i -g typescript,这里使用的是npm命令&#xff0c;也可以使用pnpm和yarn安装&#xff0c;不过需要额外安装pnpm 和yarn。 2.第一个一ts为后缀的文件&#xff0c;使用命令&#xff1a; tsc *.ts 就会生成对应…

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好&#xff0c;我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题&#xff0c;希望对大家有帮助&#xff1b; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;开发人员可以使用它来进行分布式数据的发布…

学习React(状态管理)

随着你的应用不断变大&#xff0c;更有意识的去关注应用状态如何组织&#xff0c;以及数据如何在组件之间流动会对你很有帮助。冗余或重复的状态往往是缺陷的根源。在本节中&#xff0c;你将学习如何组织好状态&#xff0c;如何保持状态更新逻辑的可维护性&#xff0c;以及如何…

基于自组织映射的检索增强生成

大量数据用于训练大型语言模型 (LLM)&#xff0c;该模型包含数百万和数十亿个模型参数&#xff0c;目的是生成文本&#xff0c;例如文本补全、文本摘要、语言翻译和回答问题。虽然 LLM 从训练数据源中开发知识库&#xff0c;但总有一个训练截止日期&#xff0c;在此日期之后 LL…

java jts 针对shp含洞多边形进行三角剖分切分成可行区域

前言 java jts 提供了Delaunay三角剖分的相关方法,但是该方法不考虑含洞的多边形的。虽然 jts 的 ConformingDelaunayTriangulationBuilder 类可以通过提供线段约束的方式防止切割到洞内&#xff0c;但是仅支持最多99条线段&#xff0c;虽然可以通过重写破除99条线段的约束&am…

Java——————接口(interface) <详解>

1.1 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本电脑上的USB接口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上&#xff0c;可以插&#xff…

CSS Text(文本)

CSS Text(文本) CSS中的text属性用于控制文本的显示方式&#xff0c;包括字体、大小、颜色、对齐方式等。本文将详细介绍CSS中文本属性的各种用法和技巧&#xff0c;帮助您更好地设计和布局网页文本。 1. 字体属性 1.1 font-family font-family属性用于设置文本的字体。可以…

OS Copilot初体验的感受与心得

本文介绍体验操作系统智能助手OS Copilot后&#xff0c;个人的一些收获、体验等。 最近&#xff0c;抽空体验了阿里云的操作系统智能助手OS Copilot&#xff0c;在这里记录一下心得与收获。总体观之&#xff0c;从个人角度来说&#xff0c;感觉这个OS Copilot确实抓住了不少开发…

TypeScript极速梳理

TypeScript简介 TypeScript是对JavaScript的超集它对JS进行了扩展&#xff0c;向JS中引入了类型的概念&#xff0c;并添加了许多新的特性TS代码需要通过编译器编译为JS&#xff0c;然后再交由JS解析器执行TS完全兼容JS,换言之&#xff0c;任何的JS代码都可以直接当成JS使用相较…

Vue Router【实用教程】(2024最新版)vue3 路由管理

Vue Router 是 Vue 官方的客户端路由解决方案&#xff0c;在单页应用 (SPA) 中&#xff0c;用户在应用中浏览不同页面时&#xff0c;URL 会随之更新&#xff0c;但页面不需要从服务器重新加载。 核心思想&#xff1a; 通过配置路由来告诉 Vue Router 为每个 URL 路径显示哪些…