Linus 文件处理(三)

news2025/2/27 5:35:06

目录

一、前言

二、扫描目录

1、opendir

2、readdir

3、telldir

4、seekdir

5、 closedir

6、A Directory-Scanning Program

三、Errors

1、strerror

2、perror


一、前言

本文将简单介绍Linux文件和目录,以及如何操作它们(如何创建文件、打开、读、写和关闭,程序如何操作目录,如创建、扫描和删除目录等)。本文大部分内容将会介绍处理文件和目录的各种调用,涵盖了与文件相关的部分主题:(1)文件和设备;(2)系统调用;(3)库函数;(4)低级文件访问;(5)管理文件;(6)标准I/O库;(7)格式化的输入和输出;(8)文件和目录维护;(9)扫描目录;(10)错误;(11)/proc文件系统;(12)fcntl 和 mmap。这些内容本博客不会全部介绍,只是进行部分的基础介绍。

二、扫描目录

Linux 系统上的一个常见问题是扫描目录,也就是说,确定驻留在特定目录中的文件。

在 shell 程序中,这很简单——只要让 shell 展开通配符表达式即可。过去,不同的 UNIX 变体都允许对低级文件系统结构进行编程访问。我们仍然可以将目录作为常规文件打开并直接读取目录条目,但是不同的文件系统结构和实现使得这种方法不可移植。现在已经开发了一套标准的库函数,使目录扫描更加简单。

目录函数的头文件是 dirent.h,它们使用一个结构 DIR 作为目录操作的基础。指向这个结构的指针称为目录流 (DIR *),其作用与文件流 (file *) 用于常规文件操作的方式非常相似。目录条目本身以 dirent 结构返回,也在 dirent.h 中声明,因为不应该直接更改 DIR 结构中的字段。

我将复习以下函数:

❑ opendir, closedir

❑ readdir

❑ telldir

❑ seekdir

❑ closedir

1、opendir

opendir 函数的作用是:打开目录并建立目录流。如果成功,它将返回一个指向 DIR 结构的指针,用于读取目录条目。

opendir 失败时返回空指针。注意,目录流使用低级文件描述符来访问目录本身,因此如果打开的文件太多,opendir 可能会失败。

2、readdir

readdir 函数返回一个指向结构的指针,该结构详细描述了目录中的下一个目录条目流 dirp。连续调用 readdir 返回更多的目录条目。如果出现错误,并且在目录的末尾,readdir 返回 NULL。兼容 posix 的系统在目录末尾返回 NULL 时保留 errno 不变,并在发生错误时设置它。

注意,如果同时有其他进程在该目录中创建和删除文件,则 readdir 扫描不能保证列出该目录中的所有文件(和子目录)。包含目录条目详细信息的 direct 结构包括以下条目:

要确定目录中文件的进一步细节,需要调用 stat。

3、telldir

telldir 函数返回一个值,该值记录目录流中的当前位置。我们可以在后续调用 seekdir 时使用此命令将目录扫描重置到当前位置。

4、seekdir

seekdir 函数在 dirp 给出的目录流中设置目录入口指针。用于设置位置的 loc 值应该已经从之前对telldir 的调用中获得。

5、 closedir

closedir 函数关闭目录流并释放与之关联的资源。成功时返回 0,出错时返回 -1。

在下一个程序 printdir.c 中,我们将把许多文件操作函数组合在一起,以创建一个简单的目录列表。目录中的每个文件单独列在一行上。每个子目录的名称后面都有一个斜杠,其中列出的文件缩进 4 个空格。该程序将一个目录更改为子目录,以便它找到的文件具有可用的名称,也就是说,它们可以直接传递到 opendir。程序在嵌套很深的目录结构上会失败,因为打开的目录流的数量是有限制的。

当然,我们可以通过使用命令行参数来指定起点,从而使其更通用。查看诸如 ls 这样的实用程序的 Linux 源代码,并找到关于更通用实现的想法。

6、A Directory-Scanning Program

从适当的头文件开始,然后是 printdir 函数,它打印出当前目录。它将使用缩进的深度参数递归子目录。

#include<unistd.h>
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
#include<stdlib.h>

void printdir(char *dir,int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;

    if((dp=opendir(dir))==NULL){
        fprintf(stderr,"cannot open directory:%s \n",dir);
        return ;
    }
    chdir(dir);
    while((entry=readdir(dp))!=NULL){
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)){
            /* Found a directory, but ignore . and .. */
            if(strcmp(“.”,entry->d_name)==0||strcmp(“..”,entry->d_name) == 0)
                continue;
            printf("%*s%s/\n",depth,"",entry->d_name);
            /* Recurse at a new indent level */
            printdir(entry->d_name,depth+4);
        }
        else printf("%*s%s\n",depth,"",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}

int main()
{
    printf("Directory scan of /home:\n");
    printdir("/home",0);
    printf("done.\n");

    exit(0);
}

该程序扫描主目录并产生如下的输出。要查看其他用户的目录,可能需要超级用户权限。

当然该代码还可以改进一些,但这里不再进行讨论。

三、Errors

许多系统调用和函数都可能由于许多原因而失败。当出现这种情况时,它们通过设置外部变量 errno 的值来指示失败的原因。许多不同的库使用此变量作为报告问题的标准方法。值得重复的是,程序必须在给出问题的函数之后立即检查 errno 变量,因为它可能被调用的下一个函数覆盖,即使该函数本身没有失败。

错误的值和含义列在头文件 errno.h 中。它们包括:

有两个有用的函数可以在发生错误时报告错误: strerror 和 perror。

1、strerror

strerror 函数将错误号映射为描述已发生错误类型的字符串。这对于记录错误条件很有用。

2、perror

perror 函数还将 errno 中报告的当前错误映射为字符串,并将其打印到标准错误流中。它的前面是字符串 s 中给出的消息(如果不是NULL),后面是冒号和空格。

以上,Linus 文件处理(三)

祝好


 

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

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

相关文章

独家 | 使用python马尔科夫链方法建模星巴克等待时长

作者&#xff1a;Piero Paialunga翻译&#xff1a;陈超校对&#xff1a;和中华本文约4200字&#xff0c;建议阅读11分钟本文使用马尔科夫链的方法对星巴克购买咖啡的等待时长进行建模。以下内容关于如何使用马尔科夫链计算你在星巴克咖啡的等待时长。图片来自Unplash&#xff0…

Spring - ApplicationContextInitializer 扩展接口

文章目录Preorg.springframework.context.ApplicationContextInitializer扩展点扩展接口扩展生效方式方式一 &#xff1a; Spring SPI扩展方式二 &#xff1a; 配置文件方式三 &#xff1a;启动类手工add测试结果Pre Spring Boot - 扩展接口一览 org.springframework.context.…

详解诊断数据库ODX-C

文章目录 前言一、ODX—C作用是什么?二、ODX-C数据库在工具ODXStudio的编辑方法总结前言 ODX是全球通用的一种诊断数据库格式,相比CDD文件(Vector公司私有的一种数据库格式),应用场景和范围更广,包含了不同的子类: ODX-C\-D\-V\-E\-F\-FD 今天这篇文章仅对ODX-C做一个…

开源物联网系统 ThingsBoard 上手

开源物联网系统 ThingsBoard 上手 centos yum 被占用问题解决&#xff1a; 描述&#xff1a;Another app is currently holding the yum lock; waiting for it to exit 参考&#xff1a;https://blog.csdn.net/Dan1374219106/article/details/112450922 查看yum占用&#xff1a…

制作一个简单HTML中华传统文化网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

scrapy的入门使用

目录 一、 安装scrapy 1.windonws/Mac安装命令&#xff1a; 2. 安装依赖包&#xff1a;pip install pypiwin32 二、 scrapy项目开发流程 1.创建项目:    2.生成一个爬虫: 3.提取数据: 4.保存数据: 三、 创建项目 四、创建爬虫 五、完善爬虫 5.2 定位元素以及提取…

序列化与反序列化笔记

序列化与反序列化 为什么会有序列化与反序列化的需求呢&#xff1f; 序列化是把对象转换成有序字节流&#xff0c;通常都是一段可阅读的字符串&#xff0c;以便在网络上传输或者保存在本地文件中。同样&#xff0c;如果我们想直接使用某对象时&#xff0c;就可能通过反序列化…

23-Vue之事件修饰符

事件修饰符前言阻止默认行为阻止冒泡事件前言 本篇来学习两个常用的事件修饰符 阻止默认行为 .prevent : 阻止默认行为 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

基于JSP的网上书城平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469277 主要使用技术 ServletJDBCJSPC3P0JqueryMysql 功能介绍 1). 用户模块功能有&#xff1a; 用户注册: 表单页面是jQuery做校验(包含了ajax异步请求) 表单页面使用一次性图形验证码…

分布式事务Seata

目录 一、分布式事务的认识 事务的ACID原则 CAP定理 BASE理论 二、Seata简介、安装和部署 1.初识Seata 2.下载Seata&#xff08;1.4.2版本&#xff0c;其他版本可能与本章教程冲突&#xff09; 3.修改配置文件 4.在nacos添加配置 5.创建配置文件中的数据库表 6.启动TC…

二、微服务拆分案例

文章目录一、服务拆分&#xff08;order-service、user-service&#xff09;1.创建数据库2.创建order-service和user-service模块&#xff0c;引入依赖3、order-service各层代码4、user-service各层代码一、服务拆分&#xff08;order-service、user-service&#xff09; 1.创建…

猴子也能学会的jQuery第十二期——jQuery遍历

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

【金融项目】尚融宝项目(十五)

29、提现和还款 29.1、提现 29.1.1、需求 放款成功后&#xff0c;借款人可以申请提现。 参考《汇付宝商户账户技术文档》3.15用户申请提现 29.1.2、前端整合 pages/user/withdraw.vue <script> export default {data() {return {fetchAmt: 0,}},methods: {commitWit…

基于SSM的宿舍财产管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469100 主要使用技术 SpringSpringMVCMybatisEasyUIJqueryMysql 功能介绍 本系统的用户可以分为三种&#xff1a;管理员、教师、学生。 系统设置 菜单管理&#xff1a;菜单节点的增删改查…

中国传统美食网页HTML代码 学生网页课程设计期末作业下载 美食大学生网页设计制作成品下载 DW餐饮美食网页作业代码下载

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【学习笔记41】DOM操作的练习

一、回到顶部 我们在浏览页面的时候&#xff0c;当我们浏览到一个页面的底部的时&#xff0c;一般都会有一个返回底部 &#xff08;一&#xff09;案例分析 1、当页面滚动的距离大于300的时候&#xff0c;让herder和btn展示 header的top设置为0的时候就能看到btn的display设置…

web网页设计期末课程大作业——海贼王大学生HTML网页制作 HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

HTML常用标记(超详解)

目录 一、文本标记 二、列表标记 三、分割线标记 四、超链接标记 五、图片标记 六、多媒体标记 七、标记类型 八、meta标记 一、文本标记 1.标题标记 语法格式&#xff1a; <hn align"对齐方式">标题文本</hn> html中提供了六级标题&#xff…

产业经济专题:产业结构高级化、合理化指数、工业化率、机构水平化及产业升级度

一、产业关联度的密度指数 1、数据来源&#xff1a;见参考文献 2、时间跨度&#xff1a;无 3、区域范围&#xff1a;无 4、指标说明&#xff1a; 附件中包括命令和案例数据 部分数据如下&#xff1a; 计算参考文献&#xff1a; Xiao J, Boschma R, Andersson M. Industr…

分布式NoSQL数据库HBase实践与原理剖析(一)

title: HBase系列 第一章 HBase基础理论 1.1 HBase简介 Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. Apache HBase™ 是Hadoop数据库&#xff0c;是一种分布式、可扩展的大数据存储。HBase 是 BigTable 的开源 java 版本。 建立在 HDF…