当前位置: 首页 > news >正文

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 来删除或改名.

相关文章:

linux中的目录操作函数

参考 【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构 stat函数 C标准库提供了访问linux的目录的函数接口现对目录的操作。 一、libc接口 libc访问目录的流程为:打开目录,访问目录,关闭目…...

JSON 文件第一段飘红

问题 原因 这个问题通常发生在尝试用 ESLint 去解析 JSON 文件时。ESLint 主要设计用于检查 JavaScript 代码的语法和风格,而JSON是一种数据交换格式,不包含 JavaScript 的逻辑结构,如函数、变量声明等。 解释报错原因 当ESLint遇到它不能识…...

go使用gjson操作json数据

gjson使用 gjson介绍安装gjson库解析 JSON 字符串路径语法复杂查询遍历和修改结论 gjson介绍 gjson 是一个 Go 语言库,用于快速解析 JSON 数据。它提供了非常简洁的 API 来查询 JSON 数据,无需预先定义 Go 结构体或映射(map)来匹…...

Mac 下华为鸿蒙 :DevEco Studio 开发工具下载

1.登录:华为开发者中心--开发--下载工具DevEco Studio 2.下载完成后 ,安装,并创建一个新项目。 3.Tools --点击SDK Manager 下载SDK: 如果报:淘宝镜像源错误: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_H…...

C进阶—动态内存管理

这里写目录标题 动态内存分配的原因动态内存函数mallocfreecallocrealloc C/C内存开辟柔性数组柔性数组特点 动态内存分配的原因 常见的内存开辟方式: int a 10;//在栈空间上开辟4个字节 char arr[10] {0};//在栈空间上开辟连续的10个字节上述开辟的空间问题&am…...

QT表格显示MYSQL数据库源码分析(七)

一. 连接MySQL数据库 首先,创建了一个QSqlDatabase对象,并设置数据库类型为"QMYSQL"。然后,它设置了数据库的主机名,端口号,数据库名,用户名和密码。最后,尝试打开数据库连接&#x…...

excel系列(三) - 利用 easyexcel 快速实现 excel 文件导入导出

一、介绍 在上篇文章中,我们介绍了 easypoi 工具实现 excel 文件的导入导出。 本篇我们继续深入介绍另一款更优秀的 excel 工具库:easyexcel 。 二、easyexcel easyexcel 是阿里巴巴开源的一款 excel 解析工具,底层逻辑也是基于 apache p…...

探索前后端数据传输模式:Java、Go与Python的实践20240719

深入解析前后端数据传输:Java、Go与Python的实践 引言 在当今的互联网时代,用户对Web应用的性能和交互体验有着越来越高的要求。无论是信息展示型网站还是复杂的企业应用,前后端数据传输的效率和模式选择都至关重要。本文将深入探讨三种主流…...

【YashanDB知识库】yac修改参数后关闭数据库hang住

【标题】yac修改参数后关闭数据库hang住 【问题分类】性能优化 【关键词】YashanDB, yac, shutdown hang 【问题描述】修改yac参数后执行shutdown immediate,数据库hang住。 【问题原因分析】 Shutdown操作时,线程在获取gInstance->trigger->s…...

提升网站性能:ThinkPHP6中如何实现Mysql分页查询

随着互联网的快速发展,web应用程序的开发也越来越复杂。而分页查询是web应用程序中常见的功能之一。thinkphp6是一个web框架,可以帮助开发人员快速开发应用程序。在本文中,我们将讨论如何在thinkphp6中使用mysql进行分页查询。 首先&#xf…...

Python:Flask自定义URL路由参数过滤器

目录 简单的例子手动类型转换自动类型转换自定义路由过滤器 简单的例子 先看一个简单的例子&#xff0c;GET请求需要传递一个参数&#xff0c;我们直接获取的是字符串 from flask import Flaskapp Flask(__name__)app.get("/<value>") def index(value):ret…...

闭包与装饰器

一.闭包&#xff1a; 闭包是Python中的一种高级特性&#xff0c;指的是在函数内部定义了另外一个函数&#xff0c;并返回了这个内部函数作为函数对象&#xff0c;同时还保存了外层函数的状态信息。这个内部函数可以依赖外层函数的变量和参数&#xff0c;而且外层函数返回的是这…...

DNS服务器的搭建

1、DNS服务器端软件 DNS 的域名解析都是 udp/53 . 主从之间的数据传输默认使 ⽤tcp/53 DNS服务器端软件&#xff1a; Bind是⼀款开放源码的DNS服务器软件&#xff0c;Bind由美国加州⼤学Berkeley&#xff08;伯克 利&#xff09;分校开发和维护的&#xff0c;全名为Berkele…...

【JavaScript】点击穿透

点击穿透是指在某些场景下&#xff0c;⽤户在快速点击⻚⾯元素时&#xff0c;由于某些原因&#xff08;例如⽹络延迟&#xff09;&#xff0c; 在前⼀个元素上的点击事件还没有完成时&#xff0c;下⼀个元素的点击事件就已经触发了&#xff0c;导致⽤户感 觉到⻚⾯点击⽆效或者…...

[Linux]Mysql之主从同步

AB复制 一、主从复制概述 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 主从复制的作用 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xf…...

DAY21-二叉树

LeetCode538.把二叉搜索树转换为累加树 public TreeNode convertBST(TreeNode root) {reverseIn(root);return root;}public Integer value0,flag0;public void reverseIn(TreeNode root) {if(rootnull) return ;reverseIn(root.right);if(flag0) {valueroot.val;flag1;}else {…...

java面试-场景题

一、集合 1. java中如何给一个超大的一个亿左右的list数据去重&#xff1f; 我当时的回答是使用HashSet或Stream流的distinct语法。但是面试官好像更注重内存的消耗问题。 使用HashSet&#xff1a; HashSet 是一个不允许有重复元素的集合。你可以将List中的元素添加到HashSe…...

【TORCH】matplotlib绘制一条横线的两种方法

在创建图形和数据可视化时&#xff0c;你提到的两种方法都用于绘制特定的线条&#xff0c;但它们在实现方式上有所不同。我将逐一解释这两种方法的具体含义和用途。 1. 使用列表创建常数值的线条 y [1] * len(x)这行代码生成了一个列表 y&#xff0c;其长度与 x 相同&#x…...

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…...

如何让局域网中的其他电脑访问VMWare虚拟机上的Windows虚拟系统

场景描述 事情是这样的&#xff0c;我在我的主机&#xff08;Win10&#xff09;上搭建了一个VMWare虚拟机&#xff0c;并安装了Windows Server的虚拟系统&#xff0c;想用它来测试一些东西。但是呢&#xff0c;我发现尽管我的主机可以愉快地跟这个服务器对话&#xff0c;可办公…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...