c语言获取目录的列表-所有列表-当前目录-根据搜索值查询|时刻需

阅读次数: 62

  • A+
所属分类:C语言 语言学习

利用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
//其中定义的具体地址请看 

参数在io.h中的wd文档

---------------------------------------------------------------

打印十六进制的数据格式

       printf("%x\n", j); //输出结果为: 2f
       printf("%X\n", j); //输出结果为: 2F
       printf("%#x\n", j); //输出结果为: 0x2f
       printf("%#X\n", j); //输出结果为: 0X2F %#X推荐使用

---------------------------------------------------------------

一个可以打印所有文档及目录名称的例子--以后会更新更好的

#include<time.h>
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include <stdlib.h>
#include <windows.h>
#include <direct.h>

#include <io.h>


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);

}

结果将会打印所有的目录及文档


 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: