Linux下 C 遍历目录(opendir,readdir函数)
opendir()函数:
头文件:
#include <sys/types.h>
#include <dirent.h>
函数原型:
Dir* opendir(const char* pathname);
函数功能:
获取pathname目录下的所有文件和目录的列表,如果pathname是个文件或失败则返回NULL,并设置errno
返回值DIR结构体的原型为:struct _dirstream
typedef struct _dirstream 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)
};
readdir()函数:
头文件:#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dir_handle);
函数功能:读取opendir返回的那个列表
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字符 */};
其中d_type文件类型又有如下情况:
enum
{DT_UNKNOWN = 0, //未知类型DT_FIFO = 1, //管道DT_CHR = 2, //字符设备DT_DIR = 4, //目录DT_BLK = 6, //块设备DT_REG = 8, //常规文件DT_LNK = 10, //符号链接DT_SOCK = 12, //套接字DT_WHT = 14 //链接
};
演示示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>// main 函数的 argv[1] char * 作为 所需要遍历的路径 传参数给 listDir
void listDir(char *path)
{ DIR *pDir;//定义一个 DIR 类的指针struct dirent *ent;//定义一个结构体 dirent 的指针,dirent 结构体见上int i = 0; char childpath[512];//定义一个字符数组,用来存放读取的路径pDir = opendir(path); //opendir 方法打开 path 目录,并将地址付给 pDir 指针memset(childpath, 0, sizeof(childpath)); //将字符数组 childpath 的数组元素全部置零//读取 pDir 打开的目录,并赋值给 ent, 同时判断是否目录为空,不为空则执行循环体while ((ent = readdir(pDir)) != NULL){//读取 打开目录的文件类型 并与 DT_DIR 进行位与运算操作,即如果读取的 d_type 类型为 //DT_DIR (=4 表示读取的为目录)if (ent->d_type & DT_DIR) {if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {//如果读取的 d_name 为 . 或者.. 表示读取的是当前目录符和上一目录符, 用 //contiue 跳过,不进行下面的输出continue;}//如果非. ..则将 路径 和 文件名 d_name 付给 childpath, 并在下一行 prinf 输出sprintf(childpath, "%s/%s", path, ent->d_name);printf("path:%s\n", childpath);//递归读取下层的字目录内容, 因为是递归,所以从外往里逐次输出所有目录(路径+目录名)//然后才在 else 中由内往外逐次输出所有文件名listDir(childpath);}//如果读取的 d_type 类型不是 DT_DIR, 即读取的不是目录,而是文件,则直接输出 d_name, 即输出文件名elseprintf("%s\n", ent->d_name);}
}int main(int argc, char *argv[])
{listDir(argv[1]); //第一个参数为想要遍历的linux目录。例如,当前目录为 ./ ,上一层目录为../return 0;
}
Linux下 C 遍历目录(opendir,readdir函数)相关推荐
- Linux下 C++遍历目录文件
可参考如下代码或者参考链接博客. 测试代码: #include <iostream> #include <stdio.h> #include <unistd.h> ...
- linux下C++遍历文件夹下的全部文件;Windows/Linux下C++批量修改文件名,批量删除文件...
Linux下 C++遍历目录下所有文件 1 rename(image_path.c_str(), image_path_new.c_str()); 2 remove(image_path_move.c ...
- linux下的主要目录
2019独角兽企业重金招聘Python工程师标准>>> [Linux系统目录结构] 登录系统后,在当前命令窗口下输入 ls / 你会看到 以下是对这些目录的解释: /bin bin是 ...
- Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )
r:表示可读w:表示可写x:表示可执行也可以用数字表示这一点我们会在修改文件权限说明.对于文件夹的rwx表示:r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可 ...
- linux 设备数 of,linux下devicetree中惯用的of函数
linux下devicetree中常用的of函数 从device_node中获取信息: int of_property_read_u8_array(const struct device_node * ...
- Linux下使用C语言访问MySQL函数
//mysqlVersion.c /************************************************************* FileName : mysqlVers ...
- mysql 多数据库文件_今天突然发现我的Linux下MySQL数据库目录多了好多文件
今天再次重现Blog了,虽然很忙,还是要来写一下Blog的,嘻,首先还是一样先谢谢Sery 今天发现了我的Linux下Mysql数据库目录多了好多Mysql-bin.0000X这些文件,经过自己查找资 ...
- Linux下C如何调用PCI Lib函数
Linux下C如何调用PCI Lib函数 在Linux下,可以通过"setpci"和"setpci"命令来访问PCI设备的配置空间,那么能否用程序来访问PCI ...
- 怎么查这个文件在linux下的哪个目录
因为要装pl/sql所以要查找tnsnames.ora文件..看看怎么查这个文件在linux下的哪个目录 find / -name tnsnames.ora 查到: /opt/app/oracle/p ...
最新文章
- PCL中3D特征描述子Shot详解
- mysql和mybatis面试题_2020年,MyBatis常见面试题总结
- npm install -g -S -D的区别及应用场景
- boost::system::generic_category相关的测试程序
- 【数据结构】二叉树的存储和遍历
- Java Swagger的注释类是怎么被调用到的
- 31模板方法(Template Method)
- (第七天)DOM练习一
- PHP网站开发有哪些框架,罗列几款时下高人气的PHP开发框架
- ios实例开发精品文章推荐(8.13)
- oracle spfile和pfile文件(转)
- 职业生涯(一)——你就是自己想要成为的那个人!
- Git提交代码的处理流程(转)
- 8路USB继电器模块 windows Linux使用
- 2.证券投资基金的概述
- 聊一哈,新入如何优雅的跟老板打招呼
- AI作画的人机战争走向何方?
- centos7下安装pg数据库
- Android——百度语音唤醒
- 商业智能BI企业管理决策之经营管理会议