利用目录函数(opendir,readdir,closedir)查找文件个数

原文链接: https://www.cnblogs.com/love-DanDan/p/8724225.html

一、简介

如何知道一个目录下的所有文件个数呢?Linux系统io函数为我们提供了目录操作函数。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。

二、函数接口

1、opendir函数

函数原型:

DIR *opendir(const char *name);

依赖头文件:

#include <sys/types.h>
#include <dirent.h>

作用:

打开一个目录。

返回值:

DIR结构体指针,(DIR类似于FILE结构体)保存了所打开的的目录信息;失败返回NULL。

2、readdir函数

函数原型:

struct dirent *readdir(DIR *dirp);

依赖头文件:

#include <dirent.h>

作用:

读目录。

扫描二维码关注公众号,回复: 7638564 查看本文章

返回值:

成功返回dirent结构体指针。失败返回NULL。 这里我们来仔细看看dirent结构体的组成:

struct dirent
{
   long d_ino;					/* inode number 索引节点号 */
   off_t d_off;					/* offset to this dirent 在目录文件中的偏移 */
   unsigned short d_reclen;		/* length of this d_name 文件名长 */
   unsigned char d_type; 		/* the type of d_name 文件类型 */
   char d_name [NAME_MAX+1];	/* file name (null-terminated) 文件名,最长255字符 */
}
3、closedir函数

函数原型:

int closedir(DIR *dirp);

依赖头文件:

#include <sys/types.h>
#include <dirent.h>

返回值:

成功返回0,失败返回-1。

三、实例代码

#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;
}

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)
    {
        //要忽略掉.和 .. 如果读到它们,就不要对他们操作。strcmp函数用于比较字符串,相等返回0;
        if (strcmp(di->d_name, ".") == 0 || strcmp(di->d_name, "..") == 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;
}

猜你喜欢

转载自blog.csdn.net/hexf9632/article/details/100887077