如何知道一个目录下的所有文件个数呢?或许可以用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)查找文件个数的更多相关文章

  1. php目录函数

    1.创建 mkdir()mkdir(目录地址,权限模式,是否递归创建)默认不支持递归创建,用第三个参数true表示递归创建 <?php header("content-type:tex ...

  2. linux find-在指定目录下查找文件

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find ...

  3. php 目录函数和日期函数

    continue . break . exit目录函数opendir(); 打开一个文件夹is_file 只判断文件是否存在: file_exists 判断文件是否存在或者是目录是否存在: is_di ...

  4. find命令的基础用法以及按文件修改时间查找文件

    一般文件查找方法: find 命令学好是一件很有趣的事情,也可以帮你在查找系统文件的时候事倍功半,还可以与正则表达式结合使用,功能强大,是一个很好的查找工具.可以整体提高你的系统管理能力. 基础用法 ...

  5. linux find 命令查找文件和文件夹

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 详解: find命令用来在指定目录下查找文件.任 ...

  6. 004PHP文件处理——目录操作:glob rewinddir opendir readdir

    <?php /** * 目录操作:glob rewinddir opendir readdir */ //glob 以数组形式返回,参数1这个目录的所有内容,可以置顶返回的具体类型 //只遍历输 ...

  7. PHP常用文件函数和目录函数整理

    一.常用文件函数库 1.basename(); -- 返回路径中的文件名部分. string basename ( string $path [, string $suffix ] ) //给出一个包 ...

  8. 使用php glob函数查找文件,遍历文件目录(转)

    函数说明:array glob ( string $pattern [, int $flags ] )功能:寻找与模式匹配的文件路径,返回包含匹配文件(目录)的数组(注:被检查的文件必须是服务器系统的 ...

  9. opendir函数和readdir函数内涵及用法

    工作中遇到奇怪的事,加载增量的时候加载不上.于是开始分析原因,log里边没有任何错误信息,只有加载完成的标志.增量的数据在目录里边是存在的,但是显示的目录大小却不是4096,而是17,不知道为什么.后 ...

随机推荐

  1. 01-TCP/IP概述

    TCP/IP 概述 允许不同厂家的各种型号的计算机使用不同操作系统互相进行通信 真正的开放系统 "全球互联网"或"因特网"的基础 2.分层 网络协议通常分不同层 ...

  2. Java里数组的三种初始化方式

    静态初始化 除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值. // 静态初始化 int[] iStaticArr = { 5, 2, 0 }; LOLHero[ ...

  3. XHR HTTP 请求 get post请求解决方案

    XHR请求的 测试方式, postman 64位下载地址: http://www.downza.cn/download?file=2017%2F01%2FPostmanwin64493.zip& ...

  4. [UE4]更新UI的三种方式

    一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...

  5. Python首次安装后运行报错(0xc000007b)的解决方法

    最近在安装完Python后运行发现居然报错了,错误代码是0xc000007b,于是通过往上查找发现是因为首次安装Python缺乏VC++库的原因,下面通过这篇文章看看如何解决这个问题吧.   错误提示 ...

  6. (转)CS域和PS域

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013485792/article/details/50818356 CS域和PS域的区别: 1.基 ...

  7. ipv6 操作

    netsh interface teredo set state disablednetsh interface ipv6 add v6v4tunnel interface=IP6Tunnel 120 ...

  8. 一个服务器的IIS只能绑定一个HTTPS也就是443端口

    默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 地址:C:\Windows\System32\inetsrv\config\appli ...

  9. (转)SQL知识_Sql日期时间格式转换

    原文地址:http://www.cnblogs.com/Gavinzhao/archive/2009/11/10/1599690.html sql server2000中使用convert来取得dat ...

  10. DB通用类:Sqlite通用类库

    Sqlite通用类库 using System; using System.Collections; using System.Collections.Generic; using System.IO ...