【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( ...
随机推荐
- 如何在ppt或word中添加高亮代码?
如何在ppt或word中添加高亮代码? 问题: 如何ppt中添加带有语法高亮的程序代码,就如同下面的形式(在ppt嵌入高亮代码,且可以编辑,带有行号) 详细的要求如下: 1.代码带有语法高亮. 2.结 ...
- svm工具箱快速入手简易教程
首先svm是用来做分类的,是一种有监督的分类器. 什么是有监督的呢?就是说在你给我一个数据集让我做分类之前.我已经有一些经验数据了.即要先进行学习,再进行分类. 这里就有了训练集和测试集.先用训练集来 ...
- MySQL存储过程相互调用
什么都不说了上代码: 方式一: 第一个存储过程:test1,参数如下:IN `user_name` VARCHAR(50),OUT `uid` bigint(20) BEGIN #Routine b ...
- 幽灵漏洞(Ghost gethost)
幽灵漏斗简介: 编号CVE-2015-0235的GHOST(幽灵)漏洞是Qualys研究员发现的一个Linux服务上非常严重的安全漏洞,可以被利用来远程代码执行及本地权限提升. 漏洞简要描述 该漏洞存 ...
- 使用组件构建Android应用程序
原文链接:http://android.eoe.cn/topic/android_sdk 应用程序组件 Android's application framework lets you create ...
- 怎样使用 Apache ab 以及 OneAPM 进行压力測试?
下一个 release 准备小长假后就要 go-live .全部的測试 case 都 cover 过了.但还未进行过压力測试,有点不放心,刚好过节期间家人都回家去了,假期最终能够抽点时间压測一把. A ...
- exe4j打包java应用程序
转载地址:http://blog.csdn.net/fog911811/article/details/6151700 第一.将应用程序导出成一个JAR文件. 1.先打包程序成一个jar.在eclip ...
- 检查本机显卡的cuda信息及适配cuda-sdk版本
1.按照本机显卡的最新版本,一般用驱动精灵安装,省事. 2.右击桌面->nvidia控制版本->"帮助"->"系统信息“ 3.这里有”显示“,主要记录了 ...
- FFmpeg Basic学习笔记(3)
视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...
- Python3判断shell下进程是否存在&&启动&&邮件通知
判断进程是否存在 def isRunning(process_name): try: process = len(os.popen('ps aux | grep "' + process_n ...