利用C来获取某个目录下的所有目录及文档
控制参数 及返回值
1.是否是查询所有还是只查询当前目录
2.查询的后缀名
3.查询的名字中包含这个值(或者完全匹配)
4.是否将结果输出到某个文件中去(默认的文件路径 或写入参数)
4.返回类型 JSON格式 默认是数组格式
代码思维流程
利用 _findfirst 和 _findnext 这两个函数来循环读取目录里的目录或文档
需要掌握的知识:
---------------------------------------------------------------
strcat 字符串链接
strcpy 字符串复制
---------------------------------------------------------------
0x00000001是个啥?32位表示、十六进制表示
0x0000 0001首先他是个16进制的数字、
8进制的是0开头的、比如 077 他是八进制的、十进制的话就是63、7*8+7=63
0x0000 0001他表示一个32位的、
因为十六进制的一位有16种变化、四位的变化也是16种。
那么、想表示32位的数据、需要16进制的
bit 0000 0000 0000 0000 0000 0000 0000 0001
0x 0 0 0 0 0 0 0 1
0x开头的是16进制的数字、十六进制一位可以代表4bit 的数据
--------------------- ------------------------------------------
C语言下文件目录遍历通常会用到下面这些函数
_access() /* 判断文件或文件夹路径是否合法 */
_chdir() /* 切换当前工作目录 */
_findfirst() /* 查找第一个符合要求的文件或目录 */
_findnext() /* 查找下一个 */
_findclose() /* 关闭查找 */
与此同时还会使用到 struct _finddata_t 结构体
struct _finddata_t {
unsigned attrib; /* 表示文件的属性 */
time_t time_create; /* 表示文件创建的时间 */
time_t time_access; /* 表示文件最后访问的时间 */
time_t time_write; /* 表示文件最后写入的时间 */
_fsize_t size; /* 表示文件的大小 */
char name[FILENAME_MAX]; /* 表示文件的名称 */
};
文件属性(attrib)的值可以取下面的值:
#define _A_NORMAL 0x00000000 //未知
#define _A_RDONLY 0x00000001 //只读文件
#define _A_HIDDEN 0x00000002 //隐藏文件
#define _A_SYSTEM 0x00000004 //系统文件
#define _A_VOLID 0x00000008 //未知
#define _A_SUBDIR 0x00000010 //目录格式
#define _A_ARCH 0x00000020 //文档格式
在io.h文件中FILENAME_MAX 被定义为260
//其中定义的具体地址请看
---------------------------------------------------------------
打印十六进制的数据格式
printf("%x\n", j); //输出结果为: 2f
printf("%X\n", j); //输出结果为: 2F
printf("%#x\n", j); //输出结果为: 0x2f
printf("%#X\n", j); //输出结果为: 0X2F %#X推荐使用
---------------------------------------------------------------
一个可以打印所有文档及目录名称的例子--以后会更新更好的
#include
#include
#include
#include
#include
#include
#include
#include
main(){
int i = 0;
char file_path[50];
time_t start,end;
printf("请输入文件的绝对路径:\n");
scanf("%s",file_path );
start = time(NULL);
file_list(file_path);
end = time(NULL);
printf("runtime is:%f(s)\n",difftime(end,start));/*调用difftime函数,从start到end说经过的时间*/
return 0;
}
int file_list(char *file_path){
struct _finddata_t file;//定义结构体 file
long handle; //定义 资源类型 andle
int file_num = 1;//定义当前目录的第几个文件或目录
FILE *pf = NULL;
char temp_file_path[300];//目录的绝对路径的临时存放地址
strcpy(temp_file_path, file_path);
strcat(temp_file_path,"*.*");//这个地方可以 通过正则匹配来声明更多的参数和功能
printf("当前要打开的文件路径:%s\n",temp_file_path);
handle = _findfirst(temp_file_path,&file);//查找目录或文档 然后将结果 放入 ile中
//如果查询成功则 handle = 0;
if(handle == -1){
//没有查询到任何信息
return 0;
}else{
printf("当前目录%s的第%d个文件名字是:%s\n",file_path,file_num,file.name);
}
while (!(_findnext(handle, &file))){
file_num++;
printf("当前目录%s的第%d个文件名字是:%s\n",file_path,file_num,file.name);
printf("当前目录%s的第%d个文件类型是:%#x\n",file_path,file_num,file.attrib);
printf("-------------------\n");
if(file.attrib == _A_SUBDIR && file.name[0] != '.'){
//如果是目录的话
//继续调用自己再次 查询
//整理查询前要传递的参数
char son_file_path[300];
strcpy(son_file_path,file_path);
strcat(son_file_path,file.name);
strcat(son_file_path,"/");
printf("当前目录%s的第%d个儿子目录全路径是:%s\n",file_path,file_num,son_file_path);
file_list(son_file_path);
}
}
_findclose(handle);
}
结果将会打印所有的目录及文档