linux下对目录文件进行操作(打开目录,读取目录项,关闭目录),进入目录的函数chdir,七篇文件I/O文章小结

news2024/11/26 18:34:20

目录文件介绍

目录也是一种文件,因此操作流程与普通文件类似,有诸如打开、关闭、定位等概念,但目录是一种特殊的文件,目录存储的数据的最小单位并不是字符,而是目录项。这使得目录跟普通文件又有区别。目录项指的是结构体struct dirent{},其内部保存的是文件的名称、idnode节点号等基本信息,不包含文件具体内容。

// 目录项结构体
struct dirent
{
    ino_t  d_ino;       /* i-node节点号 */
    char   d_name[256]; /* 文件名 */
};

这个结构体中可能还会有其他的属性,但是我们一般用不到,并且不同电脑环境下结构体内部字段有些差别,但是i-node节点号和文件名这两个字段一定都存在。

这里的idnode节点号对应的是一个idnode结构体变量,保存着文件的基本信息如文件大小、权限、所有者、所属组、创建时间、修改时间等,所以这个idnode号可以用来进一步查询文件的详细信息

opendir,readdir,closedir(打开,读取,关闭目录)

与文件操作类似,要操作目录,首先是打开目录获取代表目录的“目录指针”,然后读取目录的基本单元“目录项”,最后关闭目录指针释放资源。操作函数如下:

示例代码:

int main(void)
{
    // 打开目录,获取目录指针
    DIR *dp = opendir("a");

    // 读取每个目录项,并输出各个文件的名称
    struct dirent *ep;
    while(1)
    {
        ep = readdir(dp);

        // 读完了
        if(ep == NULL)
        {
            break;
        }

        printf("%s\n", ep->d_name);
    }
}

注意:

这里readdir函数每次读取正确的时候返回的是文件项指针,所以这里我们要使用指针变量来保存循环拿到的文件项指针。

完整代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<dirent.h>
#include<strings.h>
int main(int argc, char **argv) {
    if(argc!=2){
        printf("%s","需要提供目录\n");
        exit(0);
    }
//检测文件类型,只有目录文件才能输出目录项
    struct stat file_stat;
    bzero(&file_stat,sizeof(stat));
    stat(argv[1],&file_stat);
    if(!S_ISDIR(file_stat.st_mode)){
        printf("%s is NoT directory.n", argv[1]);
        exit(0);
    }
    //打开目录文件
    DIR *file_dp = opendir(argv[1]);
    if(file_dp == NULL){
        perror("opendir()failed");
        exit(0);
    }
    //读取目录项
    struct dirent *ep;
    while(1){
        ep=readdir(file_dp);
        if(ep==NULL){
            break;
        }
        printf("%s\n",ep->d_name);

    }



    return 0;
}

一个理解上易错点

打开目录并不意味着进入目录,打开目录的时候当前的进程路径并没有切换到目录文件内部,即 DIR *dp = opendir("a");这行代码并没有让我们进入到a目录里面(没有cd a),我们当前的工作路径还是在目录文件所处父目录的路径。

那我们如何来直观地感受这一点呢?上面我们的例子中输出了目录文件a下的所有文件名称,那现在我们像下图一般,在输出文件名称基础上输出文件大小。这就需要用到获取文件属性的知识,通过提供文件名,通过stat函数获取文件大小。代码如下

错误示范 

我们会发现事与愿违了,不能正确输出文件的大小,原因是stat函数找不到这些文件。我们这里提供给stat函数的文件名称都是a.txt这样形式的,是进入目录文件后才可直接看到的名称,但我们打开目录并不意味着进入了目录,我们实际上根本没有进去到目录里面,所以在外面是看不到a.txt这个名字的,想要看到的话需要添加这个文件的目录前缀,比如:linux_share/a.txt,将这个字符串提供给stat函数才能得到文件属性。

这当然是个方法,可以利用字符串拼接的方式将完整的文件名称传给stat函数,但是有点过于麻烦了。我们上面的代码会出问题的原因是当前的进程路径并没有切换到目录文件内部,我们只需要进入目录文件就行了,写cd语句肯定是不行的,这里的chdir函数可以帮助我们在代码中实现cd的功能,只需要在代码中加入这一行chdir改变进程路径代码就可以了,是不是很简便。

 正确示范

只需要在这里打开目录文件的时候顺便进入目录文件。就能实现将目录下的文件名称和文件大小都打印出来。真正进入目录的函数是chdir,其实就是和命令行中的cd功能一样。

chdir函数详解 

文件I/O文章小结

前言:截至到今天,文件I/O系列文章已经写了七篇文章,这七篇文章带着我们从系统I/O函数——>标准I/O函数,随后我们又了解了linux中文件的存储和属性相关信息,知道了如何查看文件的各种属性,最后我们简单地谈了一下linux下如何对目录文件内容进行访问。

展望未来:接下来的文章将会继续这一个专题,只不过我们要开始联系实际,使用我们开发板来巩固我们对这些内容的学习。

标准I/O

对于我们的普通文件来说我们既可以使用系统I/O和标准I/O对文件进行操作,我们推荐使用标准I/O对普通文件操作,因为多了系统的缓冲区,减少了系统I/O调用次数,操作效率提高了。但是标准I/O一般就是简化了我们对于普通文件的操作(包含二进制文件)。对于其他类型的文件我们一帮更加推荐使用系统。

系统I/O

对于FIFO 文件、符号链接、字符设备文件、块设备文件和套接字,我们推荐使用系统I/O和一些特定函数对这些文件进行操作。不同类型文件有着对应特定函数。比如说对于LCD屏幕(通常属于字符设备文件),我们常常用open和close系统I/O打开关闭文件,再配合上特定的mmap函数对设备文件进行操作。(如 open, read, write, ioctl

文件特定操作函数

对于目录文件来说我们用到的通常就是特定的函数对其进行操作

  • opendir:打开一个目录,并返回一个指向 DIR 结构的指针。
  • readdir:从目录流中读取下一个目录项。
  • closedir:关闭目录流。
  • mkdir:创建一个新目录。
  • rmdir:删除一个空目录。

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

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

相关文章

基于resttemplate实现微服务调用

子工程搭建与管理 新建一个cloud模块来作为公共模块&#xff0c;cloud模块中将管理用于微服务使用各个组件 euerka中的配置 package com.lingyang.euerka.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configu…

【Python快速入门和实践018】Python常用脚本-图片合成视频

一、功能介绍 这段代码定义了一个名为 create_video_from_images 的函数&#xff0c;用于将一个文件夹中的图像序列合并成一个视频文件。以下是该函数的主要功能和组成部分的分析&#xff1a; 函数参数 input_folder: 包含图像文件的文件夹路径。output_file: 输出视频文件的…

马斯克发布Grok-2:实时获取X资讯、多模态支持,性能追平GPT-4o

在LLM&#xff08;大型语言模型&#xff09;竞争中&#xff0c;马斯克的XAI无疑是一个强劲的对手。继宣布斥资数十亿美元购买英伟达H100 GPU用于训练自家模型后&#xff0c;XAI迅速推出了其最新的大模型——Grok-2。这一模型不仅在技术性能上对标OpenAI、Anthropic等主流大模型…

Hystrix——服务容错保护库

熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压&#xff0c;最终导致自身服务瘫痪的一种机制&#xff0c;它的功能类似电路的保险丝&#xff0c;其目的是为了阻断故障&#xff0c;从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)

接上文&#xff08;亲测有效&#xff09;SpringBoot项目集成腾讯云COS对象存储&#xff08;1&#xff09;-CSDN博客 目录 3、通用能力类 文件下载 测试 3、通用能力类 文件下载 官方文档介绍了2种文件下载方式。一种是直接下载 COS 的文件到后端服务器&#xff08;适合服务…

前端Mac解决localhost冲突问题!!!

1、报错提示&#xff1a; 运行项目的时候遇到了如下的问题&#xff0c;导致我项目运行不起来&#xff0c;查阅了一下资料发现是loaclhost有误 2、ping一下localhost 先打开终端&#xff0c;在终端输入命令&#xff1a;&#xff08;我输入这个命令的时候能ping通&#xff0c;当…

Android 使用`layer-list`打造精美的背景

引言 在 Android 开发中&#xff0c;layer-list 是一种强大的工具&#xff0c;可以帮助我们创建复杂的背景图形&#xff0c;&#x1f3a8; 这种方法可以大大提升应用的视觉效果。作为一名Android开发&#xff0c;理解和掌握 layer-list 的使用不仅可以让我们在 UI 设计上更加灵…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)519: T454430 人口增长问题

题目内容 假设目前的世界人口有 x 亿&#xff0c;按照每年 0.1% 的增长速度&#xff0c;n 年后将有多少人&#xff1f; 输入格式 一行两个正整数 x 和 n&#xff0c;之间有一个空格。其中&#xff0c;1≤x≤100,1≤n≤100。 输出格式 一行一个数&#xff0c;表示答案。以亿…

【C++ 面试 - 基础题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

对象的初始化和清理(构造和析构)

目录 一. 前言 二. 构造函数和析构函数的语法 三. 构造函数的分类和调用 四. 构造函数的调用规则 五. 深拷贝和浅拷贝&#xff08;面试常考&#xff09; 六. 初始化列表 一. 前言 任何事物都需要有一个初始化的过程&#xff0c;例如手机&#xff0c;我们在买来使用的时候手…

win10 上安装部署WSA, 在win10上运行安卓程序

windows上跑安卓程序&#xff0c; 多年前用过蓝叠bluestacks安卓模拟器 甚至还在上面跑过微信 后来听说在bluestacks上用微信&#xff0c; 可能会被封&#xff0c; 就没有后来了 最近折腾在windows上如何投屏&#xff0c;主要是将ios无线投到win10电脑上&#xff08;安卓win10直…

免费文档翻译导出怎么弄?5个文档翻译器替你解决

在日常的工作与学习中&#xff0c;我们时常会遇到需要查阅或撰写跨语言文档的情况。然而面对这些专业性强、词汇量大的文件&#xff0c;逐字逐句地手动翻译不仅耗时费力&#xff0c;还可能因理解偏差导致信息失真。 幸运的是&#xff0c;如今有不少免费文档翻译软件横空出世&a…

LDR6020双盲插便携显示器方案:重塑连接体验的新标杆

在数字化高速发展的今天&#xff0c;便携显示器已成为商务人士、游戏爱好者及远程教育学习者的得力助手。然而&#xff0c;传统便携显示器在接口兼容性与易用性方面常存在诸多不便&#xff0c;如接口方向区分困难、信号类型不匹配等问题。为了彻底解决这些痛点&#xff0c;LDR6…

基于springboot物流管理系统

TOC springboot208基于springboot物流管理系统 第1章 绪论 1.1 研究背景 互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代&#xff0c;也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端&#xff0c;也就是电脑互联网时代&…

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中&#xff0c;鉴于客户方服务器的安全配置对 MQ 中间件有所限制&#xff0c;我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而&#xff0c;近段时间客户关闭了相关端口&#xff0c;导致大量数据积压&#xff0c;需要进行补发。在补发过程…

Unity Obfuscator 使用说明

一、Assembly - Settings 1. 核心Unity程序集&#xff08;Assembly-CSharp&#xff09; Obfuscate Assembly-CSharp: 开启 这是Unity的核心程序集&#xff0c;所有没有存储在程序集定义文件&#xff08;assembly definition file&#xff09;中的代码都会被存储在这里。大多数…

排序算法介绍和sort函数应用(明明的随机数,奖学金)

排序算法介绍sort函数应用——[NOIP2006 普及组] 明明的随机数和[NOIP2007 普及组] 奖学金 1.排序算法介绍和常用排序方法复杂度2.sort函数应用2.1.[NOIP2006 普及组] 明明的随机数题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示2.1.1.题意解析2.1.2.AC代码 2.2.[NO…

win的netassist TCP测试工具和Linux的nc工具使用

写在前面 有时工作中我们编写一些tcp相关的程序&#xff0c;而netassist就是这样一款辅助我们进行TCP功能测试的工具&#xff0c;你可以从这里下载。 1&#xff1a;netassist使用 我们需要一个server程序&#xff0c;可以参考这篇文章&#xff0c;启动server后&#xff0c;就…

【python】Python如何调用外部命令,subprocess模块的详细解读以及应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

7za解压缩工具

1、unzip无法解压缩大于4G的文件 从Windows平台通过MobaXterm上传一个大小约为5G的zip文件到AutoDL Linux系统上&#xff0c;使用unzip解压过程中出现如下错误&#xff1a; 从网上搜索了一下相关资料&#xff0c;发现是当前的unzip版本不支持4G以上的压缩包。要么升级到最新…