C语言遍历文件目录:readdir,opendir
环境:Linux系统
头文件:
#include<sys/types.h>
#include<dirent.h>
一、opendir
原型
DIR* opendir (const char * path );
参数与功能
path为目录路径,打开一个目录,在失败的时候返回一个空的指针。
返回值
DIR*,DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息,其内容如下:
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;
通过opendir函数返回的dir结构可被以下函数使用:
struct dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long loc);
二、readdir
原型
struct dirent* readdir(DIR* dir_handle);
参数与功能
DIR* dir_handle就是opendir返回的DIR结构,readdir的功能就是读一个目录。
返回值
返回是dirent结构体指针,dirent结构体成员如下
struct dirent
{ long d_ino; /* inode number 索引节点号 */ 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) 文件名,最长255字符 */
}
从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用,如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。
三、stat
原型
int stat(const char *file_name, struct stat *buf);
参数与功能
file_name为readdir返回的dirent结构体中的d_name,buf为stat结构buf。
通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数stat();的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:
struct stat { mode_t st_mode; //文件访问权限 ino_t st_ino; //索引节点号 dev_t st_dev; //文件使用的设备号 dev_t st_rdev; //设备文件的设备号 nlink_t st_nlink; //文件的硬连接数 uid_t st_uid; //所有者用户识别号 gid_t st_gid; //组识别号 off_t st_size; //以字节为单位的文件容量 time_t st_atime; //最后一次访问该文件的时间 time_t st_mtime; //最后一次修改该文件的时间 time_t st_ctime; //最后一次改变该文件状态的时间 blksize_t st_blksize; //包含该文件的磁盘块的大小 blkcnt_t st_blocks; //该文件所占的磁盘块
};
四、示例
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>/* 文件大小和修改时间 */
static int get_file_size_time(const char *filename)
{struct stat statbuf;/* 判断未打开文件 */ if(stat(filename,&statbuf)==-1){printf("Get stat on %s Error: %s\n", filename, strerror(errno));return(-1);}if(S_ISDIR(statbuf.st_mode)) // 目录return(1);if(S_ISREG(statbuf.st_mode)) // 文件printf("%s size: %ld bytes\tmodified at %s", filename, statbuf.st_size, ctime(&statbuf.st_mtime));return(0);
}int main(int argc,char **argv)
{DIR *dirp;struct dirent *direntp;int stats;if(argc!=2){printf("Usage: %s filename\n\a", argv[0]);exit(1);}if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1)) // 文件或出现错误exit(1);/* 打开目录 */ if((dirp=opendir(argv[1]))==NULL){printf("Open Directory %s Error: %s\n", argv[1], strerror(errno));exit(1);}/* 返回目录中文件大小和修改时间 */while((direntp=readdir(dirp))!=NULL) {/* 给文件或目录名添加路径:argv[1]+"/"+direntp->d_name */char dirbuf[512]; memset(dirbuf,0,sizeof(dirbuf)); strcpy(dirbuf,argv[1]); strcat(dirbuf,"/"); strcat(dirbuf,direntp->d_name); if(get_file_size_time(dirbuf)==-1) break;}closedir(dirp);exit(1);
}
运行结果:
五、总结
遍历一个文件夹中内容的布奏:
首先,使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
然后,遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。
参考:
https://blog.csdn.net/u012349696/article/details/50083787
https://blog.csdn.net/hb707934728/article/details/52100853
C语言遍历文件目录:readdir,opendir相关推荐
- linux遍历文件目录
借鉴的百度文库,特此梳理.用了多少库呢,你猜 linux遍历文件目录 作业要求 示例 延伸学习 功能分析 实现步骤 获取命令行参数 判断路径类型 实现针对目录.文件的不同处理方法 如果一个路径是目录 ...
- php遍历文件制作删除,使用PHP遍历文件目录与清除目录中文件的实现详解
今天无聊中练习了一下PHP遍历文件目录的程序,编写了以下两个程序,不过质量不是很好,轻拍~~~ 1.清除PHP缓存文件 复制代码 代码如下: function read_dir($dir,$file) ...
- java遍历文件目录
java遍历文件目录 遍历文件目录(直接输出) public static void main(String[] args) {//通过findfile静态方法对文件进行递归遍历File f = ne ...
- Linux系统C语言遍历系统文件系统,并查询其磁盘使用率(有效磁盘)
getmntent_r接口示例程序地址:https://github.com/Rtoax/test/tree/master/c/glibc/mntent statfs 接口示例程序地址: ...
- c语言遍历字节,C语言遍历结构体
假设结构体为: typedef struct { unsigned char ucType; char cProgramID[32]; char cRegionGroupID[32]; unsigne ...
- 易语言遍历两个数组成员保留不重复数据
比较两个一维数组里的成员,保留不重复的数组成员,封装了一个去数组重复成员的模块. 数组比较模块源码 .版本 2.子程序 数组比较 .参数 arrA, 整数型, 数组 .参数 arrB, 整数型, 数组 ...
- 解决R语言临时文件目录的问题(tempdir、tempfile)
解决R语言临时文件目录的问题(tempdir.tempfile) 参考文章: (1)解决R语言临时文件目录的问题(tempdir.tempfile) (2)https://www.cnblogs.co ...
- Kotlin遍历文件目录
Koltin的简洁与强大,看遍历文件目录这个例子就知道了. 写文件和读文件是处理单个文件,没有太复杂的需求 倘若要求遍历某个目录下面的所有文 本文件或者图片文件,那就麻烦了,因为该功能的需求点很丰富, ...
- c语言遍历exe的目录,如何用纯C获取一个文件目录。
目录函数,所在函数库为dir.h.dos.h int chdir(char *path) 使指定的目录path(如:"C:\\WPS" )变成当前的工作目录,成 功返回0 ...
最新文章
- java tf值搜索_搜索引擎优化 TF_IDF之Java实现
- 计算机电缆zrdjypvp,ZRDJYPVP电缆什么标准
- 把JS里面的Date规范输出为“YYYY-MM-DD HH:mm:SS”的字符串
- ROS 机器人操作系统进阶实战
- cocos2d, Box2D
- Rails 3:提高Ajax应用速度
- 一文搞懂RSOP偏振态旋转
- Python学习 Day 1-简介 安装 Hello world
- android 拍照 比例,Android全屏摄像头 – 同时保持摄像头选择的比例
- C++中使用GSoap
- 【材料力学】基于Matlab APP Designer 开发的绘制静定梁剪力、弯矩与挠曲线的软件
- 计算机应用技术新生入学感想,大学新生入学心得体会范文(精选9篇)
- ldo和dcdc功耗_DCDC与LDO的区别详解
- 金融计算器--麦考利久期(Macaulay_Duration)
- 第025篇:诚意回归CSDN博客之旅(内含SPM惊喜消息)
- java设置input隐藏,控制input输入框提示信息显示和隐藏的方法
- sql update
- CSDN21天学习挑战赛——Python常用标准库概述
- ListView的分割线相关属性
- 剪映 for Mac(全能好用的视频编辑工具)