基于Linux使用C语言实现简单的目录管理

在Linux下,需要实现某个目录下文件的遍历的时候,可以使用opendir,readdir,closedir这些接口。这些接口使用说明如下所示:

1).opendir

DIR* opendir(const char * name);  

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

传入name路径,成功则返回非空DIR指针,否则返回NULL; 注意DIR前面没有struct,如果加上编译器会warning。

2).readdir

struct dirent *readdir(struct DIR* dir);  

readdir一般要配合opendir使用,readdir不是线程安全函数,代替他的有readdir_r。

readdir返回 struct dirent *指针,读完目录下所有文件时,返回NULL。

3).closedir

void closedir(DIR* dir);   关闭打开的目录描述符dir,同时释放dir空间。Closedir需要配合opendir使用。

下面简单记录下这些接口的使用例子,主要涉及文件遍历,文件查找,文件模糊查找,文件删除,关键字查找并删除等功能。

1.首先在Linux系统下,在这里创建一个命名为"proj"测试的工程。

2.创建一个名为“dirtest.c”的源文件,粘贴如下所示的内容:

#include<stdio.h>
#include<stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <dirent.h>
#include<string.h>//定义一些文件操作的宏
#define MODE_LIST_ALL_FILE 0                //列出所有文件
#define MODE_FIND_FILE 1					  //查找一个文件
#define MODE_DELETE_FILE 2                 //删除一个文件
#define MODE_FUZZY_SEARCH_FILE 3           //通过关键字匹配查找文件
#define MODE_FUZZY_SEARCH_DELETE_FILE 4    //通过关键字匹配查找并删除文件/*
函数功能:列出该目录下的所有文件
*/
void list_all_files(DIR *dir)
{int index=0;struct dirent *d;while ((d = readdir(dir)) != NULL){index++;LOG("[index %d]:%s\n", index, d->d_name);	}}
/*
函数功能:查找文件
返回:1,成功找到;0:未找到文件
*/int find_files(DIR *dir, char *file)
{struct dirent *d;int find = 0;while ((d = readdir(dir)) != NULL){
//如果名称匹配上,则打印出该文件名称提示if(!strcmp(d->d_name, file)) {LOG("Locate the file named%s\n", d->d_name);find = 1;//返回结果置1}}return find;
}
/*
函数功能:通过关键字匹配查找文件
返回:1,成功找到;0:未找到文件
*/int fuzzy_search_files(DIR *dir, char *keyword)
{struct dirent *d;int find = 0;while ((d = readdir(dir)) != NULL){
//如果名称匹配上,则打印出该文件名称提示if(strstr(d->d_name, keyword)) {LOG("file :%s match!!!\n", d->d_name);find = 1;//返回结果置1}}return find;
}/*
函数功能:删除一个文件
返回:1,成功找到,并删除该文件;0:未找到文件
*/
int delete_files(DIR *dir, char *test_dir, char *file)
{struct dirent *d;int find = 0;while ((d = readdir(dir)) != NULL){if(!strcmp(d->d_name, file)) {char delete_file[64]="";sprintf(delete_file, "%s/%s", test_dir, file);//需要将路径+文件名才能正确删除unlink(delete_file);LOG("delete file:%s success!\n", delete_file);find = 1;}}return find;
}
/*
函数功能:删除通过关键字匹配上的文件
返回:1,成功找到,并删除该文件;0:未找到文件
*/
int delete_files_by_keyword(DIR *dir,  char *test_dir, char *keyword)
{struct dirent *d;int find = 0;while ((d = readdir(dir)) != NULL){if(strstr(d->d_name, keyword)) {char delete_file[64]="";sprintf(delete_file, "%s/%s", test_dir, d->d_name);//需要将路径+文件名才能正确删除unlink(delete_file);LOG("delete file:%s success!\n", delete_file);find = 1;}}return find;
}
/*
函数功能:接收并解析命令行输入的参数
返回:无
*/void dir_proc(char *argv[])
{char *dir_name = argv[1];int cmd_code = atoi(argv[2]);DIR *dir;struct dirent *d;dir = opendir(dir_name);if (!dir){LOG("cannot open dir %s", dir_name);return ;}//根据代号,作出不同的操作switch(cmd_code) {case MODE_LIST_ALL_FILE:{//显示该目录下的所有文件list_all_files(dir);break;}case MODE_FIND_FILE:{
//查找文件if(argv[3]) {if(!find_files(dir,argv[3])) {LOG("file name %s not found!\n", argv[3]);}}else {show_help();}break;}case MODE_DELETE_FILE:{
//删除文件if(argv[3]) {if(!delete_files(dir,argv[1], argv[3])) {LOG("file name %s not found!delete fail\n", argv[3]);}}else {show_help();}break;}case MODE_FUZZY_SEARCH_FILE:{//通过关键字查找文件if(argv[3]) {if(!fuzzy_search_files(dir, argv[3])) {LOG("file name search by keywords %s fail!\n", argv[3]);}}else {show_help();}break;}case MODE_FUZZY_SEARCH_DELETE_FILE:{//通过关键字查找,并删除文件if(argv[3]) {if(!delete_files_by_keyword(dir,argv[1], argv[3])) {LOG("file name search by keywords %s fail!\n", argv[3]);}}else {show_help();}break;}default:{LOG("command unkown!\n");break;}}closedir(dir);
}

 3.创建一个名为”main.c”的文件,内容如下所示:

#include<stdio.h>
#include<stdlib.h>
#include <stdarg.h>
#include <sys/types.h>
#include <dirent.h>
#include<string.h>/*
函数功能:日志打印
*/
void LOG(const char *format,...)
{va_list argptr;char buffer[2048];va_start(argptr,format);vsprintf(buffer,format,argptr);va_end(argptr);printf("%s", buffer);
}
/*
函数功能:显示菜单选项
*/
void show_help()
{LOG("Invalid parameter!\n");LOG("-h:Show help\n");LOG("0:List all files\n");LOG("1:Find a file, (for example: ./dirtest test_dir 1 a.txt)\n");LOG("2:Delete a file, (for example: ./dirtest test_dir 2 a.txt)\n");LOG("3:Fuzzy find file, (for example:  ./dirtest test_dir 3 a)\n");LOG("4:Delete files by keyword, (for example:  ./dirtest test_dir 4 a)\n");
}
/*
程序入口
*/
int main(int argc, char *argv[])
{LOG("run dir test!\n");if(argc<3) {show_help();exit(0);}dir_proc(argv);return 0;
}

4.创建一个编译的Makefile,方便编译整个工程,内容如下所示:

CPROG	= dirtest   #生成一个名为dirtest的目标文件
BIN     = $(CPROG) 
CC= gcc
OBJS=main.o dirtest.oall: $(BIN) 
clean:rm -f $(OBJS) $(BIN)
$(BIN): $(OBJS)$(CC)  -o $(BIN) $(OBJS)   $(CFLAGS) $(LDFLAGS) $(CFLAGS_EXTRA) 

 5.创建完dirtest.c,main.c,Makefile后,便可以编译了,在该工程目录下执行make clean;make,编译成功之后会生成一个名为 “dirtest”的可执行文件。如下图所示:

 6.测试,在该路径下创建一个名为“test_dir”的目录,然后随意创建一些文件。如下图所示:

6.1列出路径下的所有文件

6.2查找文件

6.3删除文件

6.4关键字查找文件

6.5通过关键字查找,并删除文件

至此,上述功能已简单测试完毕。

总结:关于目录的操作例子就写到这里了,熟悉了这些操作,自然而然地可以自己先ls的命令了。在后续的工作中,如果有遇到针对目录以及里面相关文件的管理操作,就可以在这个例子的基础上进行快速改装了。

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

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

相关文章

Linux系统学习总结(上)

B站大学地址&#xff1a;第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…

车企都卷入鸿蒙开发的行了!难怪岗位需求量涨这么快!!!

近日华为鸿蒙 OS 官微宣布&#xff0c;首批汽车行业伙伴广汽传祺、岚图汽车、零跑汽车、凯翼汽车官宣加入鸿蒙生态。 这四家车企加入&#xff0c;会不会影响着其他车企想哪些手机APP厂商那种陆续的跟上呢&#xff1f; 其实在此前国内新能源扛把子比亚迪早已与华为达成了合作&a…

18个惊艳的可视化大屏(第26辑):航空与运输业

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第26期了&#xff0c;本次带来可视化大屏在航空与运输业的应用案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 可视化大屏在航空与运输业中具有以下九大价值&#xff1a; 实时监控…

IT系统可观测性

什么是可观测性 可观测性&#xff08;Observability&#xff09;是指能够从系统的外部输出推断出系统内部状态的能力。在IT和云计算领域&#xff0c;它涉及使用软件工具和实践来收集、关联和分析分布式应用程序以及运行这些应用程序的硬件和网络产生的性能数据流。这样做可以更…

心灵治愈交流平台|基于springboot框架+ Mysql+Java+B/S结构的心灵治愈交流平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 心理咨询师功能 系统功能设计 数据库…

蓝桥杯前端Web赛道-输入搜索联想

蓝桥杯前端Web赛道-输入搜索联想 题目链接&#xff1a;1.输入搜索联想 - 蓝桥云课 (lanqiao.cn) 题目要求&#xff1a; 题目中还包含effect.gif 更详细的说明了需求 那么观察这道题需要做两件事情 把表头的每一个字母进行大写进行模糊查询 这里我们会用到几个js函数&#…

洛谷 P1378 油滴扩展

本道题可以理解成一个平面直角坐标系&#xff0c;在坐标系上标出整个矩形和油滴的坐标&#xff0c;计算两个油滴的面积和直径&#xff0c;判断点是否在圆内&#xff08;点与圆的位置关系&#xff09;&#xff0c;利用使用坐标求两点间距离的公式取解。 代码如下&#xff1a; …

SpringBoot异常:类文件具有错误的版本 61.0, 应为 52.0的解决办法

问题&#xff1a; java: 无法访问org.mybatis.spring.annotation.MapperScan 错误的类文件: /D:/Program Files/apache-maven-3.6.0/repository/org/mybatis/mybatis-spring/3.0.3/mybatis-spring-3.0.3.jar!/org/mybatis/spring/annotation/MapperScan.class 类文件具有错误的…

实体门店加盟全解析:如何选择加盟项目与避免风险

对于想要开实体店或创业的人来说&#xff0c;拥有一个全面的运营方案是成功的关键。作为一名开鲜奶吧5年的创业者&#xff0c;我将为大家详细分享从选址到日常管理的实体店运营要点&#xff0c;帮助创业者少走弯路。 一、选择加盟项目 1.行业前景&#xff1a;选择一个有发展前…

Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据 爱好&#xff1a;学习<input type"checkbox" value"study" v-model"hobby">打游戏<input type"checkbox" value"games" v-model"hobby">吃饭<input type"checkbox" v…

大数据开发--01.初步认识了解

一.环境准备 1.使用虚拟机构建至少三台linux服务器 2.使用公有云来部署服务器 二.大数据相关概念 大数据是指处理和分析大规模数据集的一系列技术、工具和方法。这些数据集通常涉及海量的数据&#xff0c;包括结构化数据&#xff08;如关系型数据库中的表格&#xff09;以及…

美联社报道波场与亚马逊云计算重磅合作 称符合其去中心化使命

近日,波场TRON宣布已集成亚马逊云计算服务(AWS),引发美联社、金融时报、费加罗报等多家海外主流媒体高度关注。报道表示,此次集成旨在利用AWS 强大的云计算资源,降低用户和开发者参与波场网络的准入门槛,打造更加去中心化、更强大的区块链生态系统。 报道内容显示,通过此次合作…

基于spring boot的民宿预约管理系统的设计与实现

目录 摘要 I Abstract II 一、绪论 1 &#xff08;一&#xff09;研究背景 1 &#xff08;二&#xff09;社会调查 1 &#xff08;三&#xff09;研究意义 2 &#xff08;四&#xff09;研究内容 2 二、关键技术介绍 3 &#xff08;一&#xff09;Spring Boot框架 3 &#xff…

GESP2024年3月C++语言三级答案(均为自己的想法,C++没学太多,有不对的地方欢迎指正)

选择题&#xff08;每题2分&#xff0c;共30分&#xff09; 第 1 题 整数-5的16位补码表示是(D)。 A. 1005 B. 1006 C. FFFA D. FFFB 解析&#xff1a;0是FFFF&#xff0c;用0-5&#xff08;即FFFF-5&#xff09;得到是FFFB。 第 2 题 如果16位短整数-2的二进制是“FFFE”&…

YOLOv9改进策略:注意力机制 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;用于微小目标检测的上下文增强和特征细化网络ContextAggregation&#xff0c;助力小目标检测 yolov9-c-ContextAggregation summary: 971 layers, 51002153 parameters, 51002121 gradients, 238.9 GFLOPs 改…

springboot277流浪动物管理系统

流浪动物管理系统设计与实现 摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流…

PSCA系统控制集成之复位层次结构

PPU 提供以下对复位控制的支持。 • 复位信号Reset signals&#xff1a;PPU 提供冷复位和热复位输出信号。PPU 还为实现部分保留的电源域管理提供了额外的热复位输出信号。 • 电源模式控制Power mode control&#xff1a;PPU 硬件适当地管理每个支持的电源模式转换的复位信号…

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛选美 试题二&#xff1a;树的重心 试题三&#xff1a;大臣的差旅费 试题四&#xff1a;扫雷 试题一&#xff1a;奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎&#xff0c;…

华为畅享 60X 用了这么久,说说真实感受

华为畅享 60X 上市也有1年了&#xff0c;为什么还要说这款手机&#xff0c;是因为用了这么久这款手机真的让人忍不住竖起大拇指&#xff01;给父母准备的这款机子&#xff0c;在千元机里没得说&#xff01; 华为畅享 60X 很适合中老年人用户&#xff0c;日常长辈们在用机时对手…

SqlServer2008(R2)(二)SqlServer2008(R2)安装和卸载注意事项整理

二、注意事项 1、 安装数据中心版 说明&#xff1a;此激活版仅用于测试和学习使用。 这是官方的下载页面&#xff08;需要付费订阅&#xff09;&#xff1a; http://msdn.microsoft.com/zh-cn/subscriptions/downloads/default.aspx 数据中心版&#xff1a; PTTFM-X467G-P7RH…