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语言查看一个文件夹中所有文件及目录相关推荐

  1. matlab依次读取每个数,『matlab如何依次读取文件夹中EXCEL文件,并对每一个EXCEL特定列全部数值进行处理?』matlab调入excel文件的某一列...

    matlab导入excel表格,第一行为x,第一列为y的数据,其余为z 行的NI(r=1--0.25)比烦. filename='a.xls';%,可据你的需要更改 y=xlsread(filenam ...

  2. 如何将多个文件夹中的文件合并到一个文件夹中

    Question to say "I can!" 如何将多个文件夹中的文件合并到一个文件夹中 2011-11-27 这个算是小小的技巧吧!有两种方法,一种是传统的命令行,另一种是用 ...

  3. Flume监听文件夹中的文件变化,并把文件下沉到hdfs

    1.采集目录到HDFS 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 采集源,即source--监控文件目录 ...

  4. Flume监听文件夹中的文件变化_并把文件下沉到hdfs

    摘要: 1.采集目录到HDFS 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 采集源,即source--监控文 ...

  5. 获取文件夹中所有文件的文件名[重复]

    本文翻译自:Getting the filenames of all files in a folder [duplicate] Possible Duplicate: 可能重复: Read all ...

  6. mvfiles:一次性提取多个文件夹中的文件

      作者:吴玉轩 (南开大学) Stata 连享会: 知乎 | 简书 | 码云 | CSDN   Stata连享会 精品专题 || 精彩推文 2019暑期"实证研究方法与经典论文" ...

  7. 拷贝文件(包括文件夹中的文件夹)

    ''' 1.查看来源文件夹中的文件 2.通过遍历得到文件夹中的文件(文件名+扩展名) 3.拼接文件 (文件夹+文件名+扩展名) 4.判断来源文件中是 文件夹 还是 文件明.扩展名如果是文件夹则:.提前 ...

  8. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  9. C++读取文件夹中所有文件的路径,包含子文件夹

    C++读取文件夹中所有文件的路径,包含子文件夹 C++实现指定文件夹的路径,获取该路径下所有文件的路径,含子文件夹的文件,为了实现跨平台编译,最后会给出Window和Linux的完成程序: [1]下面 ...

最新文章

  1. SSE命令示例代码(整型、读写控制寄存器、混杂、矩阵变换)
  2. ecs服务器网站文件放在哪里,云服务器ecs文件放哪里
  3. centos7修改系统语言为简体中文
  4. Quartz 定时任务(Scheduler)的 3 种实现方式
  5. Nagios显示器mysql定从库: libmysqlclient.so.18: cannot open shared object file: No such
  6. 操作系统用户态内核态线程同步
  7. centos-stream-9安装chrome谷歌浏览器
  8. 后缀自动机线性构造方法
  9. 【Proteus仿真8086】往8086 内存中写入数据
  10. 百度开源的 71 个项目,你用过几个 ?
  11. c语言max函数是什么,什么是C语言函数
  12. 苹果新功能之Continuity Camera连续性摄像头,是拯救者还是革新者
  13. 解决windows10中springboot的jar启动之后的假死状态
  14. 你知道CAD软件将圆弧与直线转换成多段线的方法吗?
  15. 青龙面板薅羊毛教程之矿二代每日保底1R
  16. ubuntu(linux) 离线更新显卡驱动
  17. Mini CFA 考试练习题 Economics of International Trade
  18. zzulioj1017C语言答案,郑州轻工业大学oj题解(c语言)1017,1018 if典型题
  19. python二级考试14问(关于真正考试的时候的相关问题)
  20. allegro如何导入DXF文件

热门文章

  1. Java HttpClient使用小结
  2. 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列
  3. 【简单易懂】getBean(id)和getBean(Class)使用的区别
  4. 43行代码AC_HDU-2604 Queuing(矩阵快速幂,附详细的知识讲解、模板例题)
  5. vue 安装php,vue中使用openinstall
  6. 数据库概述(了解数据库,当前数据库介绍,mysql数据库介绍,安装mysql数据库)
  7. 大数据常见组件的访问页面总结
  8. 高并发环境下的Nginx该如何优化,让用户再也不会说卡
  9. 在c语言中i10是什么意思啊,2011年计算机二级考试C语言十套上机题
  10. 用python批量创建docker_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3...