Linux C 目录编程

news2025/1/11 22:45:35

目录编程

  • 前言
  • 目录编程函数
      • mkdir  创建目录
      • rmdir  删除目录
      • opendir  打开目录
      • readdir  读取目录
      • stat  获取文件信息
      • chdir  跳转目录
      • closedir  关闭目录
  • 判断文件类型的宏
  • 遍历指定目录及子目录下所有.c文件示例

前言

  相较于文件编程,目录编程也有一套自己的函数,可以进行创建、打开、读取等目录操作。
  在日常中使用较多的是遍历目录,比如音乐播放器检测本地音乐、视频播放器打开指定目录下的视频等等。

目录编程函数

mkdir  创建目录

头文件:
  #include <sys/stat.h>
  #include <sys/types.h>
函数原型:int mkdir(const char *pathname, mode_t mode);
参数介绍:
  pathname:要创建的文件的 路径+名字
  mode:创建的文件的权限(与umask相关)
返回值:创建成功返回0,失败返回-1。

	mkdir ( "./1.txt" , 0644 );

rmdir  删除目录

头文件:
  #include <unistd.h>
函数原型:int rmdir(const char *pathname);
参数介绍:
  pathname:要删除的文件的 路径+名字
返回值:删除成功返回0,失败返回-1。

	rmdir ( "./1.txt" );

opendir  打开目录

头文件:
  #include<sys/types.h>
  #include<dirent.h>
函数原型:DIR * opendir(const char * name);
参数介绍:
  name:要打开的目录的 路径+名字
返回值:如果成功打开目录,则返回一个指向该目录的目录流指针,如果失败,则返回NULL。

	DIR * dir = opendir ( "/home/wwz" );

readdir  读取目录

头文件:
  #include<sys/types.h>
  #include<dirent.h>
函数原型:struct dirent * readdir(DIR * dir);
参数介绍:
  dir:opendir返回的目录流指针
返回值:成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回NULL。

	struct dirent * readpos = readdir ( dir );

stat  获取文件信息

头文件:
  #include<sys/types.h>
  #include<unistd.h>
函数原型:int stat(const char * file_name,struct stat *buf);
参数介绍:
  file_name:要获取信息的文件 路径+名字
  buf:保存文件信息的stat结构体容器
返回值:执行成功则返回0,失败返回-1,错误代码存于errno。

	//初始化结构体
	struct dirent * readpos = NULL;//目录流指针
	//打开目录
	DIR * dir = opendir ( "/home/wwz" );
	//当该文件能读取信息时
	while ( (readpos = readdir( dir )) != NULL )
	{
		char path[512] = {0};
		struct stat statpos;//文件信息结构体
		sprintf( path , "%s%s" , "/home/wwz" , readpos->d_name );
		//获取文件信息
		if( !stat ( path , &statpos ) )
		{
			printf(```结构体成员```)
		}
	}

while循环能遍历打印目录下的所有文件在这里插入图片描述

chdir  跳转目录

头文件:
  #include<unistd.h>
函数原型:int chdir(const char * path);
参数介绍:
  path:要跳转的目录 路径+名字
返回值:执行成功则返回 0,失败返回-1,errno 为错误代码。

	chdir ( "/home/root/" );

closedir  关闭目录

头文件:
  #include<sys/types.h>
  #include<dirent.h>
函数原型:int closedir(DIR *dir);
参数介绍:
  dir:要跳转关闭的目录的目录流指针
返回值:关闭成功则返回 0,失败返回-1,errno 为错误代码。

	closedir ( dir );
	//如果将该函数与打开目录函数置于获取文件信息
	//示例代码中并加入是否为文件判断
	//就可以递归的遍历所有文件
	
	//在文档末尾我会提供一个查看目录下
	//以及子目录下所有.c文件的例子

判断文件类型的宏

  当然想要实现遍历指定目录及子目录下所有.c文件还要判断文件的类型,<stat.h>中提供了相应的宏定义。

带参宏无参宏解释
S_ISLNK(mode)S_ISLNK判断是否为链接文件类型
S_ISREG(mode)S_ISREG判断是否为普通文件类型
S_ISDIR(mode)S_ISDIR判断是否为目录类型
S_ISCHR(mode)S_ISCHR判断是否为字符型设备类型
S_ISBLK(mode)S_ISBLK判断是否为块设备类型
S_ISFIFO(mode)S_ISFIFO判断是否为命名管道类型
S_ISSOCK(mode)S_ISSOCK判断是否为套接字类型

遍历指定目录及子目录下所有.c文件示例

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

void isDir(char *dir);
void isFile(char *name);

int main(int argc,char *argv[])
{
	//路径信息通过argv传输
	if(argc == 1)
		printf("运行时请输入至少一个路径\n");
	//如果存在多个路径信息
	else
		while(--argc)
		//先判断是不是文件,如果是文件,否则就打开目录
			isFile(*++argv);
	
	return 0;
}

void isFile(char * name)
{
	struct stat buff = {0};
	//或取文件信息
	int ret = stat(name,&buff);
	if(ret == -1)
	{perror("stat");exit(1);}
	
	if(S_ISDIR(buff.st_mode))//如果是目录
		isDir(name);
	else if(S_ISREG(buff.st_mode))//如果是普通文件
	{
		 char *tempFileName = name;
		 //tempFileName为指针,可以进行偏移操作
		 //下面的 tempFileName + strlen(name)-2 就是将指针偏移到末尾的 .c 的位置
		 if( strncmp ( tempFileName + strlen(name)-2 , ".c" , 2) == 0)
		 	printf( "%s\n" , tempFileName );
	}
}

void isDir(char *dir)
{
	struct dirent *sdp;
	char path[256];
	//打开目录
	DIR *dp = opendir(dir);
	if( dp == NULL )
	{perror("opendir");return;}
	//遍历目录
	while( (sdp = readdir(dp)) != NULL)
	{
		//防止跳转当前上级目录 造成死循环
		if(strcmp(sdp->d_name,".")==0||strcmp(sdp->d_name,"..")==0)
            continue;
        //或取文件信息
        sprintf(path,"%s/%s",dir,sdp->d_name);
        isFile(path);
	}
	//关闭文件
	int ret = closedir(dp);
	if(ret == -1)
	{perror("closedir");return;}
}

运行结果图:在这里插入图片描述

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

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

相关文章

RT-Thread构建与配置系统

简述 RT-Thread的构建与配置系统由以下几个部分组成&#xff1a; KConfig&#xff1a;kernel config配置文件&#xff08;提供系统的配置裁剪功能&#xff09;SCons&#xff1a;构建工具env工具&#xff1a;主要提供构建系统所需的各种环境变量以及软件包的管理 Kconfig在R…

MATLAB中plot函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 创建线图 绘制多个线条 根据矩阵创建线图 指定线型 指定线型、颜色和标记 在特定的数据点显示标记 指定线宽、标记大小和标记颜色 添加标题和轴标签 绘制持续时间并指定刻度格式 基于表绘制坐标 在一个轴…

编程艺术之源:深入了解设计模式和设计原则

深入了解设计模式和设计原则 一、认识设计模式1.1、设计模式是什么&#xff1f;1.2、设计模式是怎么来的&#xff1f;1.3、设计模式解决了什么问题&#xff1f; 二、设计模式的基础2.1、面向对象思想2.2、设计原则 三、如何学习设计模式3.1、明确目的3.2、学习步骤 总结 一、认…

时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测(SE注意力机制)

时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测&#xff08;SE注意力机制&#xff09; 目录 时序预测 | MATLAB实现WOA-CNN-GRU-Attention时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MATLAB实现…

“可一学院”新课程《区块链企业应用》正式上线

2023年8月&#xff0c;上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日&#xff0c;可一学院正式推出一门新课程《区块链企业应用》&#xff0c;这门课程将帮助学习者了解企业需要什么样的区块链&#xff0c;以及应该如何运用这项技术来推动自身…

vite基础学习笔记:14.路由跳转(二)携带query参数

说明&#xff1a;自学做的笔记和记录&#xff0c;如有错误请指正 1. 路由跳转&#xff08;携带query参数&#xff09; &#xff08;1&#xff09;第一层路由&#xff08;点击卡片路由跳转至新页面-携带query参数&#xff09; 知识点&#xff1a; query传参对应的是path和qu…

Gradio App生产环境部署教程

如果机器学习模型没有投入生产供人们使用&#xff0c;就无法充分发挥其潜力。 根据我们的经验&#xff0c;将模型投入生产的最常见方法是为其创建 API。 然而&#xff0c;我们发现这个过程对于 ML 开发人员来说可能相当令人畏惧&#xff0c;特别是如果他们不熟悉 Web 开发的话。…

我在Vscode学OpenCV 色彩空间转换

文章目录 色彩【 1 】色彩空间&#xff08;色域&#xff09;&#xff08;1&#xff09;**RGB色彩空间**与xyz色彩空间的转换将 RGB 色彩空间转换为 XYZ 色彩空间将 XYZ 色彩空间转换为 RGB 色彩空间 &#xff08;2&#xff09;**CMYK色彩空间**&#xff08;3&#xff09;**HSV*…

贪吃蛇(c语言)!!源码加解析

目录 1.建议先把源码拿去VS中测试一下了解这个贪吃蛇是什么样的 1.头文件代码 2.源代码 3.测试代码 4.代码详解 1.头文件的解析 2.源代码的解析 1.光标的位置封装函数 2.打印欢迎界面 3.打印整体的一个地图 4.蛇的初始化 &#xff08;重要&#xff09; 5.打印边栏信…

过去5年,Python生态有什么变化?

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我&#xff0c;持续接收优质好书、高效工具和赚钱机会&#xff0c;一起提升认知和思维。 过…

《网络协议》04. 应用层(DNS DHCP HTTP)

title: 《网络协议》04. 应用层&#xff08;DNS & DHCP & HTTP&#xff09; date: 2022-09-05 14:28:22 updated: 2023-11-12 06:55:52 categories: 学习记录&#xff1a;网络协议 excerpt: 应用层、DNS、DHCP、HTTP&#xff08;URI & URL&#xff0c;ABNF&#xf…

2个器件,做1个恒流源

在项目中经常要用到恒流源&#xff0c;查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源&#xff0c;这种设计思路可以扩展到其他类型的电源芯片上&#xff0c;如开关电源及其他类型的线性电源&#xff0c;关键点在于基准电压VREF的使用…

免费分享一套基于Springboot+Vue的在线考试系统,挺漂亮的

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue的在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】springbootvue在线考试系统 Java毕业设计_哔哩哔哩_bilibili【免费】springbootvue在线考试系统 Java毕业设计项目来自互联网&a…

GPT 写作与改编

GPT 写作与改编 文商科GPT 写作收益 改编技巧【改编一段话】【改编评价】【意识预设】落差&#xff0c;让顾客看到就感性和冲动害怕&#xff0c;让顾客看到就想买和拥有画面&#xff0c;切换空间&#xff0c;瞬间代入&#xff0c;勾人魂魄对比&#xff0c;设置参考物&#xff0…

港科夜闻 | 香港科大(广州)知识转移办公室创业中心主办的INNOPITCH路演推介会成功举办...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、11月7日&#xff0c;由香港科大&#xff08;广州&#xff09;知识转移办公室创业中心主办的“INNOPITCH路演推介会&#xff1a;新材料、能源环保、微电子技术专场”在香港科大&#xff08;广州&#xff09;校园内举办。十…

《网络协议》05. 网络通信安全 · 密码技术

title: 《网络协议》05. 网络通信安全 密码技术 date: 2022-09-10 15:16:15 updated: 2023-11-12 07:03:52 categories: 学习记录&#xff1a;网络协议 excerpt: 网络通信安全&#xff08;ARP 欺骗&#xff0c;DoS & DDoS&#xff0c;SYN 洪水攻击&#xff0c;LAND 攻击&a…

实验室(检验科)信息系统源码,医学检验LIS系统源码,云LIS源码

实验室&#xff08;检验科&#xff09;信息系统源码&#xff0c;LIS源码&#xff0c;基于云计算技术的LIS系统源码&#xff0c;云LIS源码 LIS系统(LaboratoryInformationSystem) 即 实验室&#xff08;检验科&#xff09;信息系统&#xff0c;它是医院信息管理的重要组成部分之…

利用OGG实现PostgreSQL实时同步

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

任正非说:到现在我们终于可以说没有失败,但我们还不能说成功。

你好&#xff01;这是华研荟【任正非说】系列的第36篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 华研荟导语&#xff1a;今天的任正非先生讲话主要节选了他在2001-2004年的几个关于IPD、ISC的论述&#xff0c;可能大家会发现…

Linux shell编程学习笔记24:函数定义和使用

为了实现模块化设计和代码重用&#xff0c;很多编程语言支持函数或过程&#xff0c;Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处&#xff0c;也有自己独特之处。 1 函数的定义 1.1 标准格式 function 函数名(){语句或命令1……语句…