利用目录函数(opendir,readdir,closedir)查找文件个数
如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数。Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配套使用。)。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。下面我来介绍一下:
opendir函数:
函数原型:DIR *opendir(const char *name);
依赖头文件: #include <sys/types.h> #include <dirent.h>
作用:打开一个目录。
返回值:DIR结构体指针,(DIR类似于FILE结构体)保存了所打开的的目录信息;失败返回NULL。
readdir函数:
函数原型:struct dirent *readdir(DIR *dirp);
依赖头文件:#include <dirent.h>
作用:读目录。
返回值:成功返回dirent结构体指针。失败返回NULL。这里我们来仔细看看dirent结构体的组成:

closedir:
函数原型:int closedir(DIR *dirp);
依赖头文件:#include <sys/types.h> #include <dirent.h>
,失败返回-1。
接下来我们开始编码:
我们先定义一个函数:long get_dir_number(char * filepath)
下面是它的内容:
long get_dir_number(char * filepath)
{
long FileNumber = 0;//存储文件个数
DIR *dir = opendir(filepath);//先打开文件
if (NULL == dir)//判断是否打开成功
{
perror("打开文件");
exit(1);
}
struct
dirent *di;//dirent结构体指针,用于指向数据
char p_file[1024];//用于拼接字符串。遇到子目录。
while ((di = readdir(dir)) != NULL)
{
//要忽略掉.和 .. 如果读到它们,就不要对他们操作。
if (strcmp(di->d_name, ".") == 0 || strcmp(di->d_name, "..") == 0)
//strcmp函数用于比较字符串,相等返回0;
{
continue;//忽略掉
}
//遇到目录就要进入,使用递归
else
if (di->d_type == DT_DIR)
{
sprintf(p_file, "%s / %s", filepath, di->d_name);
FileNumber += get_dir_number(p_file);//这里是+=
}
else//我这里是统计的所有文件,不管是什么类型的。可以自定义条件,统计不同类型的文件数目
{
FileNumber++;
}
}
closedir(dir);
return FileNumber;
}
挺简单的。现在来看主函数:
#include
<dirent.h>
#include
<stdio.h>
#include
<string.h>
#include
<stdlib.h>
long get_dir_number(char * filepath);//函数声明
int main(int
argc, char *argv[])
{
if (argc<2)
{
printf("需要目录名。\n");
exit(1);
}
long nu = get_dir_number(argv[1]);
printf("%s目录下有%ld个文件。\n", argv[1], nu);
return 0;
}
就这样,统计文件数目的小程序就完成了。
利用目录函数(opendir,readdir,closedir)查找文件个数的更多相关文章
- php目录函数
1.创建 mkdir()mkdir(目录地址,权限模式,是否递归创建)默认不支持递归创建,用第三个参数true表示递归创建 <?php header("content-type:tex ...
- linux find-在指定目录下查找文件
推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find ...
- php 目录函数和日期函数
continue . break . exit目录函数opendir(); 打开一个文件夹is_file 只判断文件是否存在: file_exists 判断文件是否存在或者是目录是否存在: is_di ...
- find命令的基础用法以及按文件修改时间查找文件
一般文件查找方法: find 命令学好是一件很有趣的事情,也可以帮你在查找系统文件的时候事倍功半,还可以与正则表达式结合使用,功能强大,是一个很好的查找工具.可以整体提高你的系统管理能力. 基础用法 ...
- linux find 命令查找文件和文件夹
查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 详解: find命令用来在指定目录下查找文件.任 ...
- 004PHP文件处理——目录操作:glob rewinddir opendir readdir
<?php /** * 目录操作:glob rewinddir opendir readdir */ //glob 以数组形式返回,参数1这个目录的所有内容,可以置顶返回的具体类型 //只遍历输 ...
- PHP常用文件函数和目录函数整理
一.常用文件函数库 1.basename(); -- 返回路径中的文件名部分. string basename ( string $path [, string $suffix ] ) //给出一个包 ...
- 使用php glob函数查找文件,遍历文件目录(转)
函数说明:array glob ( string $pattern [, int $flags ] )功能:寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注:被检查的文件必须是服务器系统的 ...
- opendir函数和readdir函数内涵及用法
工作中遇到奇怪的事,加载增量的时候加载不上.于是开始分析原因,log里边没有任何错误信息,只有加载完成的标志.增量的数据在目录里边是存在的,但是显示的目录大小却不是4096,而是17,不知道为什么.后 ...
随机推荐
- tar -zxvf中的z是个什么鬼
习惯了tar -czvf和tar -zxvf.今天在本地用压缩软件7z打了一个tar包,在docker容器中用tar -zxvf怎么都解压不了,报错gzip: stdin: not in gzip f ...
- [UE4]Horizontal Box
HorizontalBox是让子控件水平排列. 属性图如下 Padding 留白.当子控件定义好位置与大小之后,再按padding的值,偏移,这个属性会影响子控件在布局里的位置.一般用于间隔 上下左右 ...
- [UE4]子弹碰撞
在子弹actor蓝图“BP_LauncherBullet”中添加一个球体碰撞组件“Sphere Collision”,并设置为actor的根组件(直接拖放到默认根组件上面就会覆盖) 子弹碰撞预设 “B ...
- phpStudy配置站点 解决You don't have permission to access / on this server
1.配置站点:打开phpStudy->其他选项菜单->站点域名管理 2.配置站点:打开phpStudy->其他选项菜单->打开hosts 3.在apache的配置文件vhost ...
- 基于 MBTiles 规范扩展的缓存文件格式说明
MBTiles 是由 MapBox 制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范.该规范由MapBox制定,详见http://mapbox.com/mbtiles- ...
- 《linux性能及调优指南》 3.3 内存瓶颈
摘要:3.3内存瓶颈OnaLinuxsystem,manyprogramsrunatthesametime.Theseprogramssupportmultipleusers,andsomeproce ...
- Solr中使用游标进行深度分页查询以提高效率(适用的场景下)
通常,我们的应用系统,如果要做一次全量数据的读取,大多数时候,采用的方式会是使用分页读取的方式,然而 分页读取的方式,在大数据量的情况下,在solr里面表现并不是特别好,因为它随时可能会发生OOM的异 ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- 【Java】边框总结
[Java]边框总结 Table of Contents 1 例子代码与结果 2 javax.swing.border 3 BorderFactory 4 LineBorder 5 MatteBord ...
- 转:Java对象序列化
Java对象序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收 ...