【C】——APUE小程序之递归遍历目录
递归降序遍历目录层次结构,并按文件类型计数。
先介绍相关的函数:
#include<dirent.h> DIR *opendir(const char *pathname); //打开目录
返回值:成功返回指针,出错返回NULL struct dirent *readdir(DIR *dp); //读取目录
返回值:成功返回指针,出错返回NULL void rewinddir(DIR *dp); //重设读取目录的位置为开头位置 int closedir(DIR *dp); //关闭目录
返回值:成功返回0,出错返回- long telldir(DIR *dp); //取得目录流的读取位置
返回值:与dp关联的目录中的当前位置 void seekdir(DIR *dp, long loc); //设置下回读取目录的位置 struct dirent{
ino_t d_ino; //i-node number
char d_name[NAME_MAX + ]; //null-terminated filename
}
改写APUE的代码:
#include<stdio.h>
#include<dirent.h>
#include<sys/stat.h>
#include<string.h>
#include<stdlib.h> static int nreg = , ndir = , nblk = , nchr = , nfifo = , nslink = , nsock = , ntot = ; static char *fullpath; int myfunc(const char *pathname, const struct stat *statptr, int type)
{
switch(type){
case :
switch(statptr->st_mode & S_IFMT){
case S_IFREG: nreg++; break;
case S_IFBLK: nblk++; break;
case S_IFCHR: nchr++; break;
case S_IFIFO: nfifo++; break;
case S_IFLNK: nslink++; break;
case S_IFSOCK: nsock++; break;
case S_IFDIR:{
printf("for S_IFDIR for %s\n",pathname);
}
}
break;
case : //文件夹
ndir++; break;
case :
printf("cant read directory %s\n",pathname);
case :
printf("stat error for %s\n",pathname);
} return ;
} int dopath()
{
struct stat statbuf; //文件信息
struct dirent *dirp; //文件夹信息,包括i-node number filename
DIR *dp; //打开目录返回的指针
char *ptr; if((lstat(fullpath,&statbuf)) < )
return(myfunc(fullpath,&statbuf,));
if(S_ISDIR(statbuf.st_mode) == ) //判断是否是文件夹
return(myfunc(fullpath,&statbuf,)); myfunc(fullpath,&statbuf,); //是目录则调用函数使目录数量自加一 ptr = fullpath + strlen(fullpath);
*ptr++ = '/';
*ptr = ; if((dp = opendir(fullpath)) == NULL)
return(myfunc(fullpath,&statbuf,)); while((dirp = readdir(dp)) != NULL){
if(strcmp(dirp->d_name,".") == || strcmp(dirp->d_name,"..") == )
continue;
strcpy(ptr, dirp->d_name); dopath();
} closedir(dp); } void ftw(char *pathname)
{
#ifdef PATH_MAX
const int PATH_LEN = PATH_MAX;
#else
const int PATH_LEN = ;
#endif fullpath = malloc(PATH_LEN); strncpy(fullpath,pathname,PATH_LEN); fullpath[PATH_LEN - ] = '\0'; dopath();
} int main(int argc, char *argv[])
{
if(argc != ){
printf("enter two args\n");
exit();
} ftw(argv[]); printf("regular files: }\n",nreg);
printf("directories : }\n",ndir);
printf("block special: }\n",nblk);
printf("char special: }\n",nchr);
printf("FIFOS: }\n",nfifo);
printf("symboli links: }\n",nslink);
printf("sockets: }\n",nsock); }
需要注意的是第60行的判断一定不能少,因为在linux下创建一个空目录的时候,用ls查看其属性发现里面大小是2.写一个程序看下一个空目录里都有神马?
#include<stdio.h>
#include<dirent.h>
#include<stdlib.h>
#include<string.h> int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
char pathname[]; if(argc != ){
printf("please enter to args\n");
exit();
} puts(argv[]); strncpy(pathname, argv[], ); if((dp = opendir(pathname)) == NULL){
printf("opendir %s error\n",argv[]);
exit();
} while((dirp = readdir(dp)) != NULL){
printf("%s\n",dirp->d_name);
} closedir(dp); return ;
}
虽然是个空目录但是给的结果却是
.
..
因此要忽略掉这两个,否则会进入死循环;
【C】——APUE小程序之递归遍历目录的更多相关文章
- (实用篇)PHP不用递归遍历目录下所有文件的代码
<?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ fu ...
- Linux下文件及目录的一些操作(附递归遍历目录源码)
1.获取当前工作目录 #include <unistd.h> 1.char *getcwd(char *buf,size_t size); 2. 3.其中,buf为缓冲区地址,size为给 ...
- Java 之递归遍历目录
Java 之递归遍历目录 一.内容 输出指定目录(文件夹)下的所有文件(包括目录)的绝对路径 二.源代码:RecursiveListDirectory.java package cn.com.zfc. ...
- Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。
题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...
- Python递归遍历目录下所有文件
#自定义函数: import ospath="D:\\Temp_del\\a"def gci (path): """this is a stateme ...
- VC/MFC 下 递归遍历目录下的所有子目录及文件
在MFC下要实现文件夹的递归遍历,可用CFileFind类,依次读取文件夹下的子文件夹和文件,并判断通过判断是文件夹还是文件来决定递归遍历.递归遍历代码如下: /******************* ...
- iKcamp出品|微信小程序|工具安装+目录说明|基于最新版1.0开发者工具初中级教程分享
iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享>. ...
- IO流-递归遍历目录下指定后缀名结尾的文件名称
/* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...
- 微信小程序第3课 目录结构及小知识点
目录 目录结构 安装包下载地址 一.pages目录介绍 二.index目录介绍 index.js(相当JavaScript文件,必不可少的) index.json(可以不需要) index.wxml( ...
随机推荐
- Vue基本概念介绍及vue-cli环境搭建
1 js中初始化一个Vue对象,传的参数就是对象属性. 挂载点.模板.实例之间的关系. var vm = new Vue({ el:"#app", template:'<di ...
- php分享二十:mysql优化
1:垂直分割 示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段.那么,为什么不把他放到另外一张表中呢 ...
- 打造 Vue.js 可复用组件
Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日益庞大,组 ...
- 【小白的CFD之旅】25 二维还是三维
小白最近逛图书馆,发现最近关于Fluent的书是越来越多了,而且还发现这些关于Fluent教材中的案例都大同小异.小白接受小牛师兄的建议,找了一本结构比较鲜明的书照着上面的案例就练了起来.不过当练习的 ...
- (原创)结构体自动化转为char数组的实现
结构体自动化转换为char数组这个需求,来自于一个最近开发的一个项目,在项目开发过程中遇到一个小问题,需要将各种结构体拷贝到char数组中,这对于一个简单的结构体来说是很简单的事情,比如下面这个只有整 ...
- C++11 constexpr使用
C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...
- python(57):私有变量,代码块
转载:http://blog.csdn.net/zhu_liangwei/article/details/7667745 引子 我热情地邀请大家猜测下面这段程序的输出: class A(object) ...
- 【Java】Java复习笔记-三大排序算法,堆栈队列,生成无重复的随机数列
冒泡排序 package com.lcw.bubble; public class BubbleSort { /** * 冒泡排序 * @param args * @author 成鹏致远 */ pu ...
- webpack的css处理
webpack打包处理css的时候需要两个loader: style-loader 和css-loader 安装: npm install style-loader css-loader --save ...
- Windows下Python3+nose+appium自动化测试之Android篇
[本文出自天外归云的博客园] 简介 以下用来做自动化测试的这款app叫最爱抓娃娃,以后会改名为网易抓娃娃. 下文提到的appiumier项目里会包含用来测试的apk包以及自动化测试代码. 先说一个坑 ...