C语言遍历目录

[Linux]C语言遍历文件和目录 #include #include #include #include #include #include #include #define MAX_PATH_LENGTH 512 #define MAX_FILE_EXTENSION 9 unsigned long visit_dirs = 0; unsigned long visit_files = 0; void lis 阅读详情
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <stdlib.h> 
//最后有相关函数讲解
//将数组myarray的内容复制到数组S中
void initarray(char s[],char myarray[]) 
{
    int i;    
    for(i=0;i<strlen(myarray);i++)
    {
        s[i]=myarray[i];
    }
    s[i]='\0';
    strcat(s,"\\");    
}
//递归的列出文件夹下所有的子文件夹和文件
//参数path:要进行查找的目录路径
void queryfolder(char path[])
{    
    struct _finddata_t FileInfo; //_finddata_t是文件信息结构体    
    long Handle;
    char str1[256],str2[256];
    initarray(str1,path);
    strcat(str1,"*");
    initarray(str2,path);    
    if((Handle=_findfirst(str1,&FileInfo))==-1L) //查找目录中符合条件的文件
        printf("没有找到\n");
    else
    {
        //最先找到的是当前文件夹".",所以不用处理    
        while(!_findnext(Handle,&FileInfo))
        {
            //printf("%s\n",FileInfo.name);
            if((FileInfo.attrib & _A_SUBDIR)==16  && strcmp(FileInfo.name,".."))
            {
                //printf("%s是文件夹\n",FileInfo.name);        
                strcat(str2,FileInfo.name);
                printf("子文件夹:%s\n",str2);
                queryfolder(str2);            
            }
            else if(!(FileInfo.attrib & _A_SUBDIR))
            { 
                strcat(str2,FileInfo.name);
                printf("文件:%s\n",str2);
            }
            initarray(str2,path);        
        }     
        _findclose(Handle);        
    } 
}

int main(void) 
{
    char fpath[256]="E:\\天下足球";    
    queryfolder(fpath);    
    return 0;
}


// 以下内容为函数讲解


/*******
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[_MAX_FNAME];    //文件名
}; 

 unsigned atrrib:文 件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。
 文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、
 _A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
这 些都是在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。
既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,
来得到几个属性的综合。例如只读+隐藏+系统属性,
应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。

*********/

/********
函数名: strcat 
功  能: 字符串拼接函数 
用  法: char *strcat(char *destin, char *source); 
程序例: 

#include <string.h> 
#include <stdio.h> 

int main(void) 
{ 
   char destination[25]; 
   char *blank = " ", *c = "C++", *Borland = "Borland"; 

   strcpy(destination, Borland); 
   strcat(destination, blank); 
   strcat(destination, c); 

   printf("%s\n", destination); 
   return 0; 
} 
*********/

/********
函数名: findfirst, findnext 
功  能: 搜索磁盘目录; 取得下一个匹配的findfirst模式的文件 
用  法: int findfirst(char *pathname, struct ffblk *ffblk, int attrib); 
 int findnext(struct ffblk *ffblk); 
程序例: findnext()

#include <stdio.h> 
#include <dir.h> 

int main(void) 
{ 
   struct ffblk ffblk; 
   int done; 
   printf("Directory listing of *.*\n"); 
   done = findfirst("*.*",&ffblk,0); 
   while (!done) 
   { 
      printf("  %s\n", ffblk.ff_name); 
      done = findnext(&ffblk); 
   } 

   return 0; 
} 

*********/

_finddata_t的使用

 

   那么到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在<io.h>的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~

 

       首先讲这个结构体吧~struct _finddata_t ,这个结构体是用来存储文件各种信息的。说实话,这个结构体的具体定义代码,我没有找到,不过还好,文档里面在_find里有比较详细的成员变量介绍。我基本上就把文档翻译过来讲吧:

 

       unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY |_A_SYSTEM 。

 

       time_t time_create:这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。

 

       time_t time_access:文件最后一次被访问的时间。

 

       time_t time_write:文件最后一次被修改的时间。

 

       _fsize_t size:文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。

 

       char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在<stdlib.h>头文件中被定义,表示的是文件名的最大长度。

 

       以此,我们可以推测出,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[_MAX_FNAME];

       };

 

       前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_findfirst、_findnext和_fineclose三个函数的搭配使用了。

 

       首先还是对这三个函数一一介绍一番吧……

 

       long _findfirst( char *filespec, struct _finddata_t *fileinfo );

 

       返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。

 

       参数:

 

       filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。

 

       fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。

 

       int _findnext( long handle, struct _finddata_t *fileinfo );

 

       返回值:若成功返回0,否则返回-1。

 

       参数:

 

       handle:即由_findfirst函数返回回来的句柄。

 

       fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

 

      int _findclose( long handle );

 

       返回值:成功返回0,失败返回-1。

 

       参数:

 

       handle :_findfirst函数返回回来的句柄。

 

       大家看到这里,估计都能猜到个大概了吧?先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。恩,对,这就是正确思路。下面我们就按照这样的思路来编写一个查找C:\WINDOWS文件夹下的所有exe可执行文件的程序。

 

       #include <stdio.h>

       #include <io.h>

 

       const char *to_search="C:\\WINDOWS\\*.exe";        //欲查找的文件,支持通配符

 

       int main()

       {

            long handle;                                               //用于查找的句柄

            struct _finddata_t fileinfo;                          //文件信息的结构体

            handle=_findfirst(to_search,&fileinfo);         //第一次查找

            if(-1==handle)return -1;

            printf("%s\n",fileinfo.name);                         //打印出找到的文件的文件名

            while(!_findnext(handle,&fileinfo))               //循环查找其他符合的文件,知道找不到其他的为止

            {

                 printf("%s\n",fileinfo.name);

           }

            _findclose(handle);                                      //别忘了关闭句柄

            system("pause");

            return 0;

       }

 

       当然,这个文件的查找是在指定的路径中进行,如何遍历硬盘,在整个硬盘中查找文件呢?大家可以在网络上搜索文件递归遍历等方法,这里不再做进一步介绍。

 

       细心的朋友可能会注意到我在程序的末尾用了一个system函数。这个与程序本身并没有影响,和以前介绍给大家的使用getchar()函数的作用相同,只是为了暂停一下,让我们能看到命令提示符上输出的结果而已。不过system函数本身是一个非常强大的函数。大家可以查查MSDN看看~ 简单来说,它是一个C语言与操作系统的相互平台,可以在程序里通过这个函数,向操作系统传递command命令


【C语言】遍历目录树 ftw()和`nftw()`在内部可能会使用`readdir()`或类似的系统调用(如`open()`, read(), close() 以及可能的`stat()` 或 lstat())来获取目录内容及文件信息。文件的修改时间 (st_mtime), 访问时间 (st_atime), 和状态改变时间 (st_ctime) 不是直接保存在文件内容中的,而是在文件系统的元数据(metadata)中记录的。ftw()和`nftw()`对`readdir()`进行了高级封装,简化了递归遍历文件系统的复杂性。 阅读详情

相关推荐

二阶FLL辅助三阶PLL环路的代码解读

今天对GNSS接收机里面的载波跟踪环路代码进行了解读 以下是个人的一点见解 % 载波环第二步:环路滤波器 二阶FLL辅助三阶PLL环路 carrLoopS0 = lastCarrLoopS0 + (phaseErr*tau0PLL + freqErr*tau1FLL) * PDIcarr; carrLoopS1 = lastCarrLoopS1 + (tau1PLL*phaseErr + carrLoopS0 + tau2FLL*freqErr) * PD

LWN7321的博客 2631

C语言遍历目录及子目录下所有文件

C语言遍历目录及子目录下所有文件

c2737647040的博客 3474

STM32H743IIT6+USB3300高速HID通讯实战:从CUBEMX配置到调试避坑全记录

本文详细记录了基于STM32H743IIT6微控制器与USB3300 PHY芯片实现高速USB HID通信的完整实战过程。内容涵盖从硬件选型、STM32CubeMX工程配置(重点规避引脚映射等常见陷阱)、自定义报告描述符编写,到驱动层数据收发实现与高级调试技巧的全链路解析,旨在帮助开发者快速构建稳定、高效的嵌入式高速数据通道。

vscode5coder的博客 365

C语言文件夹遍历

【代码】文件夹遍历

Liangzhaodong的博客 1573

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 774

c语言 递归遍历目录(stat,opendir,readdir,closedir)

文章目录1、 使用函数介绍2、代码实现 1、 使用函数介绍 int lstat(cosnt char* path,struct stat* buf); 参数: path 名字 buf 查询到的文件属性 返回值: 成功 0 失败 -1 DIR* opendir(cosnt char* name); 参数: name 目录名 返回值: 成功:返回指向目录结构体指针, 失败:NULL int closedir(DIR* dirp); 参数: d

weixin_45715405的博客 2291

AI数字人短视频数字人口播数字人分身建模流程全解析

在人工智能与计算机图形学蓬勃发展的当下,数字人建模作为打造虚拟数字人的核心环节,其流程复杂且精妙,融合了多种前沿技术与创意构思,为栩栩如生的数字人形象奠定基石。​。

2403_87518095的博客 1447

使用C语言编程,使用函数的递归调用,遍历一个文件夹下的所有文件

递归遍历文件夹

Jackey_Song的博客 2023

Kaggle赛题总结:Enefit - Predict Energy Behavior of Prosumers

竞赛旨在解决能源不平衡的问题,即预计使用的能源与实际使用或产生的能源不符。自发自用者是既消耗又产生能源的个体,他们在造成能源不平衡方面起到了重要作用。尽管他们只占所有能源消费者的一小部分,但他们不可预测的能源使用行为给能源公司带来了物流和财务问题。如果不加以解决,可能会导致运营成本增加、电网不稳定以及能源资源的低效利用。如果这个问题得到有效解决,将显著降低不平衡成本,提高电网的可靠性,并使自发自用者更高效和可持续地融入能源系统中。

猫敷雪 741

LeRobot 入门教程(七)数据集

LeRobot Dataset v3.0 是机器人学习数据的标准化格式,支持多模态时间序列数据和视频的统一访问。该版本通过基于文件的存储(Parquet/MP4)、关联元数据和Hub原生流式处理等新特性,显著提升了性能并降低了存储开销。文档详细介绍了格式设计、安装使用、数据记录与加载方法,以及从v2.1迁移到v3.0的步骤,特别针对大型数据集(如DROID 1.0.1)的处理提供了SLURM集群移植方案。v3.0通过优化文件组织和元数据管理,实现了更快的加载速度、更高的内存效率和更好的可扩展性。

2506_90492529的博客 2055

C语言遍历目录文件

使用C语言的 opendir、readdir 函数读取遍历指定目录下的指定类型的文件。

奇点.的博客 3825

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3501

c语言 循环遍历目录,C语言遍历文件和目录

#include #include #include #include #include #include #include #define MAX_PATH_LENGTH512#define MAX_FILE_EXTENSION9unsigned long visit_dirs = 0;unsigned long visit_files = 0;void listdir(char *path){...

weixin_42494160的博客 1046

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c语言递归遍历某个目录下的txt文件

static int read_dir(char *dir_path) {     int dir_path_len = 0;     int dir_len = 0;     int rtn_code = 0;     char dir_whole_path[FILE_NAME_LEN] = {0};     DIR *dp;     struct dirent *dirp;

beizhetaiyangxingzou的专栏 1874

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C语言遍历文件和目录

[cpp]   #include   #include   #include   #include   #include   #include   #include   #define MAX_PATH_LENGTH 512   #define MAX_FILE_EXTENSION 9   unsigned long visit_dirs = 0;   unsigned lo...

Cづ拖延症患者 1739

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C 语言递归遍历目录下的所有文件

#include     #include     #include     #include     void   dir_scan(char   *path,   char   *file);     int   count   =   0;     int   main(i

hhtang的专栏 1604

linux用c语言来遍历目录

做遍历目录需要的函数有:DIR * opendir(const char * name);struct dirent * readdir(DIR * dir);closedir(const char * name);其中:readdir()返回参数dir目录流的下个目录进入点。结构dirent定义如下:struct dirent{ino_t d_ino;ff_t d_off;signed shor

joel_lv的专栏 1174

linux平台下基于C语言实现遍历文件目录

#include #include #include #include #include #include #include #include #include /* 文件大小和修改时间 */ static int get_file_size_time(const char *filename) { struct stat statbuf; /* 判断未打开文件 */

hb707934728的博客 3273

Linux系统下C语言实现遍历该目录下所有文件

#include <stdio.h> #include <dirent.h> //头文件 int ReadDir(char *path) //读取文件 { DIR *dir; char pathname[255]; //目录的全名,=当前目录名+子目录名 if((dir = opendir(path))==0) //无法打开则跳过 { printf

The_RedMaple的博客 5263

Linux C语言递归遍历目录

下面代码实现Linux环境下递归遍历目录 #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;sys/stat.h&gt; #include &lt;dirent.h&gt; void isfile(char *n...

wwxy1995的博客 841

C语言下遍历目录下所有文件

#define LOG_DIR “/iot/log” #define FILENAME_LOG ".log" void print_dir_files(void) { DIR *dir_fd = NULL; struct dirent *dir_ptr = NULL; if ((dir_fd = opendir(LOG_DIR)) != NULL) { ...

qq_35769746的博客 859

遍历目录(C语言)

C语言遍历目录,找到目录下以.txt结尾的文件。

weixin_43432215的博客 466

Linux C语言遍历目录结构

遍历目录结构查找文件是很常用的功能,今天介绍一下使用Linux C 遍历Linux目录结构的方法:   linux提供几个系统调用,以便于直接目录的读取和操作:   DIR * opendir(const char * pathname);   struct dirent * readdir(DIR * dir_handle);   int closedir(DIR * d...

a1510102的博客 334

linux 遍历目录文件 list命令 c语言实现

linux 遍历目录文件 list命令 c语言实现任务描述源代码(list.c)测试样例 任务描述 源代码(list.c) #include <stdio.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #define DEBUG_STD_OUTPUT enum LIST_COMMAND_ARG_INFO { ARG_NO_ATTACHED_BIT =

黑色低级高中生的博客 1745
上一篇: C语言文件操作函数大全
下一篇: strlen和sizeof的对比
DVStream
博客等级 码龄15年 50粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值