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