读取文件目录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取文件目录相关的知识,希望对你有一定的参考价值。
一.opendir与readdir函数 1.opendir是一个库函数,打开一个目录,并返回一个DIR指针给readdir函数
DIR *opendir(const char *name);
2.readdir是一个库函数,接收参数是DIR指针,返回一个struct dirent *结构体指针
struct dirent *readdir(DIR *dirp);
二.dirent结构体
struct dirent {
ino_t d_ino; /* inode number 文件的inode*/
off_t d_off; /* not an offset; see NOTES 文件所在的位置*/
unsigned short d_reclen; /* length of this record 文件名的长度*/
unsigned char d_type; /* type of file; not supported
by all filesystem types 文件类型*/
char d_name[256]; /* filename 文件名*/
};
三.可重入函数和不可重入函数
1.在readdir函数使用时,可以看出返回值struct dirent *这个结构体指针,这个结构体在使用函数之前并没有为它申请内存,可见是在readdir函数内部为其申请的内存,而readdir函数多次被调用执行时只有在第一次执行时才会为struct dirent结构体开辟空间,后面执行时都用的是第一次创建的struct dirent结构体,也就是说每次readdir函数执行时都是相互之间有关联的,因此readdir函数是不可重入的函数
2.所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。
3.不可重入函数在实时系统设计中被视为不安全函数。满足下列条件的函数多数是不可重入的:
1) 函数体内使用了静态的数据结构;2) 函数体内调用了malloc()或者free()函数;
3) 函数体内调用了标准I/O函数。
4.readdir函数还有一个类似的readdir_r函数,这个函数就是可重入的函数,需要在函数外面创建struct dirent结构体并分配内存。
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
四.示例代码
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dir = NULL;
struct dirent *ent = NULL;
if(argc != 2)
{
printf("usage:%s filename\n",argv[0]);
return -1;
}
//打开目录
dir = opendir(argv[1]);
if(NULL == dir)
{
perror("opendir");
return -1;
}
//读取目录
while(1)
{
ent = readdir(dir);
if(ent != NULL)
{
//读取到了子文件,处理子文件
printf("filename: [%s]\n",ent->d_name);
}
else
break;
}
return 0;
}
/*
* 要读取某个目录下某个文件的详细信息
*一般步骤是:
* 1.使用opendir函数打开目录A,返回指向目录A的DIR结构体指针D。
* 2.调用readdir(D)函数读取目录A下所有的文件(包含目录),返回指向A目录下所有文件的struct dirent结构体指针E。
* 3.遍历E,调用stat(E->d_name,stat *P)来获取每个文件的详细信息,存储在stat结构体P中
*
*/
以上是关于读取文件目录的主要内容,如果未能解决你的问题,请参考以下文章
jsp将图片等文件上传到服务器根目录下,读取二进制流存入mysql?怎么样实现?
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段
Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段
Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段