使用C语言查看一个文件夹中所有文件及目录

1.前言

1.1声明

文章中的文字可能存在语法错语以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

2.实现方法

为了使用C语言实现查看一个文件夹中的文件数量功能,可以使用dirent库,该库文件包含的许多UNIX系统服务的函数原型,例如opendir函数、readdir函数,可以实现查看目录中文件数量等功能。

2.1dirent中常用数据类型以及函数功能简介

下面对dirent中常用的数据类型以及函数进行简单的解释:

常用结构体:
DIR结构体:

struct __dirstream   
{   
    void *__fd;    
    char *__data;    
    int __entry_data;    
    char *__ptr;    
    int __entry_ptr;    
    size_t __allocation;    
    size_t __size;    
    __libc_lock_define (, __lock)    
};   
typedef struct __dirstream DIR;  

DIR结构体类似与FILE,可以使用该结构体保存正在被读取目录的有关信息,例如打开目录函数DIR* opendir(const char* FilePath),该函数返回值为指向DIR结构的指针(句柄),通过该指针所指向的DIR类型的结构体,可以得到该目录相关信息。

dirent的结构体:

 struct dirent
 {    
      long d_ino;       /* inode number 索引节点号 在<sys/types.h>文件该类型的描述*/
      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) 文件名,最长256字符 */
 }

一般该结构体配合readdir函数使用,也就是通过readdir函数获取到的文件属性保存到该结构体中。
需要注意的是,对于dirent的结构体,我们经常能用到该结构体中d_ name 变量, 另外 ,short d_reclen是指这个文件的文件名长度,而不是文件大小。当然,如果要获得该文件大小,可以使用sizeof ( d _name)实现。
(当然,如果我们想要得到该文件的更多信息,可以使用stat函数实现,具体用法可以参见下面的博客:
https://blog.csdn.net/farmwang/article/details/77996187

通过上述介绍,可以简单概括dirent结构体和DIR结构体的区别:dirent结构体保存的是文件属性,DIR结构体保存的目录属性。

常用库函数:
DIR* opendir(const char);
通过打开一个目录路径(const char)返回一个DIR类型的指针,后续对该目录的读取和搜索操作都使用该指针。

dirent* readdir(DIR*);
返回DIR中的目录或者文件实体指针,类型为dirent,需要注意的是,当该函数再一次被调用的时候,该dirent指针指向下一个目录或者文件实体。当函数返回NULL时,表明指针已经指向目录的结尾。

void seekdir (DIR * dir, long int offset);
用来设置目录操作流的读取位置,调用seekdir函数的时候便从该位置进行读取。参数offset表示相对于文件目录开头的偏移量。

int telldir(DIR *dir) ;
返回当前目录流中指针位置。改位置是相对于文件开头偏移量的下一个实体读取位置的返回值。

2.2函数实现

2.2.1实现逻辑

实现方法一般为:
1.打开目录(opendir());
2.读取文件(readdir());
3.关闭目录( closedir)。

2.2.2函数例子

    #include <stdio.h> 
    #include "dirent.h"  

    #define  FilePath "/opt/test"

    int main()  
    {     
    int filesize = 0;  
        DIR *dir = NULL;  
        struct dirent *entry;  

        if((dir = opendir(FilePath))==NULL)  
        {  
            printf("opendir failed!");  
            return -1;  
        }
    else  
        {  
             while(entry=readdir(dir))  
            {  
                printf("filename%d = %s",i,entry->d_name);  //输出文件或者目录的名称
                printf("filetype = %d\n",entry->d_type);  //输出文件类型   
            }  

             closedir(dir);    
     }  
     return 0;    
    }  

运行结果如下:
这里写图片描述

这里写图片描述

以上。
参考文档:
1.https://blog.csdn.net/wangshubo1989/article/details/52994327
2.https://blog.csdn.net/dream_allday/article/details/75243818
3.https://blog.csdn.net/qq_20916555/article/details/51132642
4.http://www.360doc.com/content/15/0701/10/5470123_481878714.shtml

猜你喜欢

转载自blog.csdn.net/wangqingchuan92/article/details/80109793