Linux文件遍历
来源:互联网 发布:电影网络营销策划方案 编辑:程序博客网 时间:2024/06/06 05:25
1. linux提供opendir、readdir(readdir_r)、closedir和scandir等接口实现对目录的读取;
2. readdir返回指向下一个目录项的指针,如果要自己传入缓冲区存储目录项,应使用readdir_r代替。readdir的结果中包含当前目录和上一级目录的目录项信息。
3. 在遍历过程中,进程的工作目录不会改变,在递归遍历的时候,需要改变工作目录(chdir)以识别相对路径,或者每次都限定全局路径。
4. 深度优先遍历目录树采用递归实现易编码(参见如下代码),广度优先遍历则需借助队列实现。当目录下的文件数量较少时,采用广度优先遍历效率会更高,因目录下的目录项基本都是连续存放,减少了很多磁盘寻道;而采用深度优先遍历,结果的聚合性更高。
- int dir_traverse(const char*dir_name)
- {
- DIR *dirp = opendir(dir_name);
- if(!dirp){
- perror("opendir");
- return -1;
- }
- struct stat st;
- struct dirent *dir;
- char fullpath[FILENM_MAX];
- while((dir= readdir(dirp))!= NULL) {
- if(!strcmp(dir->d_name,".") || // 考虑当前目录和上级目录,否则会死循环
- !strcmp(dir->d_name,"..")){
- continue;
- }
- sprintf(fullpath,"%s/%s", dir_name, dir->d_name);//获取全局路径
- printf("%s\n", fullpath); // 打印路径
- if(lstat(fullpath,&st) < 0) {
- perror("lstat");
- continue;
- }
- if(S_ISDIR(st.st_mode)){
- dir_traverse(fullpath);// 递归遍历子目录
- }
- }
- closedir(dirp);
- return 0;
- }
访问目录下某个文件时,需要逐个读取目录数据中的目录项并与目标进行匹配获得文件的inode号,假设文件的平均长度为10byte,加上inode、type及reclen等信息,每个目录项的平均长度为16byte,假设采用4K的数据块,则一个块可以存放256个目录项,按照ext2文件数据索引的方式,当目录下文件数n少于256*12时,则在目录下查找文件最多需要访问n/256(向上取整)个数据块,当目录下文件数更多的时候,需要访问的块数会更快的增加(后面得到存储数据的物理块号需要多级索引),这也是在目录下不应放太多文件的原因,如果将拥有很多文件的目录均分成多个子目录,多一级目录会多一次(或多次,具体依赖于子目录下文件数量)磁盘块访问,但在子目录中查找文件的磁盘访问开销会小很多。
- linux c文件遍历
- 遍历文件(linux)
- linux 文件遍历
- linux c 遍历文件
- Linux文件遍历
- Linux下遍历某一类型文件
- linux下遍历文件夹下的文件
- [Linux]C语言遍历文件和目录
- linux遍历文件夹下的文件
- linux下遍历文件夹中的文件
- linux遍历目录下的文件
- LINUX下目录文件的遍历---编程
- [Linux]C语言遍历文件和目录
- Linux下遍历所有文件及目录
- linux内核之遍历文件描述符
- Linux C 遍历文件--opendir()、readdir()...上
- linux遍历文件目录 链表形式
- Linux文件编程之遍历目录
- Ogre:Animation(Ogre中的动画)
- 从Eclipse plugin中读文件
- 面对未来,有点迷茫和不知所措
- javascript怎么实现Ajax的异步传输
- 深入浅出 Cocoa 之生成 Framework
- Linux文件遍历
- 文件的上传、下载及删除方法
- Js操作表格-对表格TR的添加/删除/拷贝
- [objective-c] ARC 补充
- PHP5 在调用 JAVA WebService 时遇到的各种问题及解决方法(二)
- Java IO与NIO的UDP开发
- Linux Shell 通配符、元字符、转义符使用实例介绍
- Computer Vision重要期刊论文
- LDD3-HELLO world.ko