使用C语言查看一个文件夹中所有文件及目录
1.前言
1.1声明
文章中的文字可能存在语法错语以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
2.实现方法
为了使用C语言实现查看一个文件夹中的文件数量功能,可以使用dirent库,该库文件包含的许多UNIX系统服务的函数原型,例如opendir函数、readdir函数,可以实现查看目录中文件数量等功能。
2.1dirent中常用数据类型以及函数功能简介
下面对dirent中常用的数据类型以及函数进行简单的解释:
常用结构体:
DIR结构体:
struct __dirstream
{void *__fd;char *__data;int __entry_data;char *__ptr;int __entry_ptr;size_t __allocation;size_t __size;__libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;
DIR结构体类似于FILE,可以使用该结构体保存正在被读取目录的有关信息,例如打开目录函数DIR *opendir(const char *FilePath), 该函数返回值为指向DIR结构的指针(句柄),通过该指针所指向的DIR类型的结构体,可以得到该目录相关信息。
dirent的结构体:
struct dirent
{long d_ino; /* inode number索引节点号 在<sys/types.h>文件该类型的描述*/off_t d_off; /* offset to this dirent 在目录文件中的偏移*/unsigned short d_reclen; /*Length of this d_name 文件名长 */unsigned char d_type; /*the type of d_name 文件类型*/char d_name[NAME_MAX+1]; /*file name (null-terminated) 文件名,最长256字符 */}
}
一般该结构体配合readdir函数使用,也就是通过readdir函数获取到的文件属性保存到该结构体中。
需要注意的是,对于dirent的结构体,我们经常能用到该结构体中d_ name 变量, 另外 ,short d_reclen是指这个文件的文件名长度,而不是文件大小。当然,如果要获得该文件大小,可以使用sizeof ( d _name)实现。
(当然,如果我们想要得到该文件的更多信息,可以使用stat函数实现,具体用法可以参见下面的博客:
https://blog.csdn.net/farmwang/article/details/77996187)
通过上述介绍,可以简单概括dirent结构体和DIR结构体的区别:dirent结构体保存的是文件属性,DIR结构体保存的目录属性。
常用库函数:
DIR *opendir(const char);
通过打开一个目录路径(const char)返回一个DIR类型的指针,后续对该目录的读取和搜索操作都使用该指针。
dirent *readdir(DIR *);
返回DIR中的目录或者文件实体指针,类型为dirent,需要注意的是,当该函数再一次被调用的时候,该dirent指针指向下一个目录或者文件实体。当函数返回NULL时,表明指针已经指向目录的结尾。
void seekdir(DIR *dir, long int offset);
用来设置目录操作流的读取位置,调用seekdir函数的时候便从该位置进行读取。参数offset表示相对于文件目录开头的偏移量。
int telldir(DIR *dir);
返回当前目录流中指针位置。该位置是相对于文件开头偏移量的下一个实体读取位置的返回值。
2.2函数实现
2.2.1实现逻辑
实现方法一般为:
1.打开目录(opendir());
2.读取文件(readdir());
3.关闭目录(closedir).
2.2.2函数例子
#include <stdio.h>
#include "dirent.h>#define FilePath "/opt/test"int main()
{int filesize = 0;DIR *dir = NULL;struct dirent *entry;if ((dir = opendir(FilePath)) == NULL) {printf("opendir failed!");return -1;} else {while (entry = readdir(dir)) {printf("filename%d = %s", i, entry->d_name); //输出文件或者目录的名称printf("filetype = %d\n", entry->d_type); //输出文件类型}closedir(dir);}return 0;
}
运行结果如下:
以上。
参考文档:
1.https://blog.csdn.net/wangshubo1989/article/details/52994327
2.https://blog.csdn.net/dream_allday/article/details/75243818
3.https://blog.csdn.net/qq_20916555/article/details/51132642
4.http://www.360doc.com/content/15/0701/10/5470123_481878714.shtml
不过,在实际的业务中,我用的是apr库的较上一层的api,因为如果用系统的api还需要考虑平台的问题。
转载地址:https://blog.csdn.net/wangqingchuan92/article/details/80109793
使用C语言查看一个文件夹中所有文件及目录相关推荐
- matlab依次读取每个数,『matlab如何依次读取文件夹中EXCEL文件,并对每一个EXCEL特定列全部数值进行处理?』matlab调入excel文件的某一列...
matlab导入excel表格,第一行为x,第一列为y的数据,其余为z 行的NI(r=1--0.25)比烦. filename='a.xls';%,可据你的需要更改 y=xlsread(filenam ...
- 如何将多个文件夹中的文件合并到一个文件夹中
Question to say "I can!" 如何将多个文件夹中的文件合并到一个文件夹中 2011-11-27 这个算是小小的技巧吧!有两种方法,一种是传统的命令行,另一种是用 ...
- Flume监听文件夹中的文件变化,并把文件下沉到hdfs
1.采集目录到HDFS 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 采集源,即source--监控文件目录 ...
- Flume监听文件夹中的文件变化_并把文件下沉到hdfs
摘要: 1.采集目录到HDFS 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 采集源,即source--监控文 ...
- 获取文件夹中所有文件的文件名[重复]
本文翻译自:Getting the filenames of all files in a folder [duplicate] Possible Duplicate: 可能重复: Read all ...
- mvfiles:一次性提取多个文件夹中的文件
作者:吴玉轩 (南开大学) Stata 连享会: 知乎 | 简书 | 码云 | CSDN Stata连享会 精品专题 || 精彩推文 2019暑期"实证研究方法与经典论文" ...
- 拷贝文件(包括文件夹中的文件夹)
''' 1.查看来源文件夹中的文件 2.通过遍历得到文件夹中的文件(文件名+扩展名) 3.拼接文件 (文件夹+文件名+扩展名) 4.判断来源文件中是 文件夹 还是 文件明.扩展名如果是文件夹则:.提前 ...
- VMware虚拟机文件夹中各文件作用详解
VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...
- C++读取文件夹中所有文件的路径,包含子文件夹
C++读取文件夹中所有文件的路径,包含子文件夹 C++实现指定文件夹的路径,获取该路径下所有文件的路径,含子文件夹的文件,为了实现跨平台编译,最后会给出Window和Linux的完成程序: [1]下面 ...
最新文章
- SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)
- ecs服务器网站文件放在哪里,云服务器ecs文件放哪里
- centos7修改系统语言为简体中文
- Quartz 定时任务(Scheduler)的 3 种实现方式
- Nagios显示器mysql定从库: libmysqlclient.so.18: cannot open shared object file: No such
- 操作系统用户态内核态线程同步
- centos-stream-9安装chrome谷歌浏览器
- 后缀自动机线性构造方法
- 【Proteus仿真8086】往8086 内存中写入数据
- 百度开源的 71 个项目,你用过几个 ?
- c语言max函数是什么,什么是C语言函数
- 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
- 解决windows10中springboot的jar启动之后的假死状态
- 你知道CAD软件将圆弧与直线转换成多段线的方法吗?
- 青龙面板薅羊毛教程之矿二代每日保底1R
- ubuntu(linux) 离线更新显卡驱动
- Mini CFA 考试练习题 Economics of International Trade
- zzulioj1017C语言答案,郑州轻工业大学oj题解(c语言)1017,1018 if典型题
- python二级考试14问(关于真正考试的时候的相关问题)
- allegro如何导入DXF文件
热门文章
- Java HttpClient使用小结
- 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列
- 【简单易懂】getBean(id)和getBean(Class)使用的区别
- 43行代码AC_HDU-2604 Queuing(矩阵快速幂,附详细的知识讲解、模板例题)
- vue 安装php,vue中使用openinstall
- 数据库概述(了解数据库,当前数据库介绍,mysql数据库介绍,安装mysql数据库)
- 大数据常见组件的访问页面总结
- 高并发环境下的Nginx该如何优化,让用户再也不会说卡
- 在c语言中i10是什么意思啊,2011年计算机二级考试C语言十套上机题
- 用python批量创建docker_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3...