使用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
 


不过,在实际的业务中,我用的是apr库的较上一层的api,因为如果用系统的api还需要考虑平台的问题。

 

 

转载地址:https://blog.csdn.net/wangqingchuan92/article/details/80109793

 

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值