递归降序遍历目录层次结构,并按文件类型计数。

  先介绍相关的函数:

#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小程序之递归遍历目录的更多相关文章

  1. (实用篇)PHP不用递归遍历目录下所有文件的代码

    <?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ fu ...

  2. Linux下文件及目录的一些操作(附递归遍历目录源码)

    1.获取当前工作目录 #include <unistd.h> 1.char *getcwd(char *buf,size_t size); 2. 3.其中,buf为缓冲区地址,size为给 ...

  3. Java 之递归遍历目录

    Java 之递归遍历目录 一.内容 输出指定目录(文件夹)下的所有文件(包括目录)的绝对路径 二.源代码:RecursiveListDirectory.java package cn.com.zfc. ...

  4. Java中递归的优缺点,Java写一个递归遍历目录下面的所有文件包括子文件夹里边的文件。

    题目: 遍历出aaa文件夹下的文件 首先分析思路: 1.首先判断这个文件夹是否为文件,通过isFile()函数可以判断是否为文件. 2.然后通过isDirectory判断是否为目录. 3.如果是目录就 ...

  5. Python递归遍历目录下所有文件

    #自定义函数: import ospath="D:\\Temp_del\\a"def gci (path): """this is a stateme ...

  6. VC/MFC 下 递归遍历目录下的所有子目录及文件

    在MFC下要实现文件夹的递归遍历,可用CFileFind类,依次读取文件夹下的子文件夹和文件,并判断通过判断是文件夹还是文件来决定递归遍历.递归遍历代码如下: /******************* ...

  7. iKcamp出品|微信小程序|工具安装+目录说明|基于最新版1.0开发者工具初中级教程分享

    iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享>. ...

  8. IO流-递归遍历目录下指定后缀名结尾的文件名称

    /* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...

  9. 微信小程序第3课 目录结构及小知识点

    目录 目录结构 安装包下载地址 一.pages目录介绍 二.index目录介绍 index.js(相当JavaScript文件,必不可少的) index.json(可以不需要) index.wxml( ...

随机推荐

  1. Sql Server Compact 4.0数据库部署安装

    Sql Server Compact 4.0相比3.5版本增强了很多,支持Entity Framework 4.1,对于轻量级应用来讲,使用Sql Server Compact 4.0是个很好的选择, ...

  2. swagger配置和简单使用

    说明:本地环境idea + maven3.5 + springboot2.0.0 + springfox-swagger2 2.8.0  + springfox-swagger-ui 2.8.0 +  ...

  3. [转] 在 Windows 中让任务栏时间显示“秒”

    1.运行 regedit,按回车键进入注册表编辑器 2.定位到: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explore ...

  4. win764bit系统plsqldeveloper11连接oracle11g64bit配置方法

    win764bit系统plsqldeveloper11连接oracle11g64bit配置方法: 原因:plsqldeveloper都是32位的没有64位的程序 准备工作: 1,先要下载instant ...

  5. 利用sdkman安装kotlin和java环境

    如果想在命令行下面运行kotlin程序,最省事的办法就是用sdkman来安装了: 1.安装sdkman: curl -s "https://get.sdkman.io" | bas ...

  6. Atitit gui界面ui技术发展史与未来趋势

    Atitit gui界面ui技术发展史与未来趋势 1. Gui技术的发展,从像素自绘到native控件体系,再到dsl h51 1.1. 编程语言的发展 从机器语言,汇编语言到本地native语言(c ...

  7. VLAN,GRE,VXLAN

    https://www.cnblogs.com/charles1ee/p/6629009.html VLAN介绍 局域网LAN(多个机器连接一个Hub或者Switch),是一个广播域 VLAN:一台S ...

  8. Ossec添加Agent端流程总结

    (1) 服务器上添加客户端 在服务器上添加客户端,执行如下命令,按照提示进行输入,红色部分是我们输入的: [root@ossec-server logs]# /var/ossec/bin/manage ...

  9. Spark SQL inferSchema实现原理探微(Python)【转】

    使用Spark SQL的基础是“注册”(Register)若干表,表的一个重要组成部分就是模式,Spark SQL提供两种选项供用户选择:   (1)applySchema     applySche ...

  10. ubuntu rar文件解压中文乱码问题

    http://blog.csdn.net/android_huber/article/details/7382867 前段时间经常要在ubuntu系统中去解压rar的文件,但是每次解压出来却总是出现中 ...