[WinAPI] API 13 [遍历指定目录 打印文件和其他属性]

简介:


Windows API中,有一组专门的函数和结构,用于遍历目录,它们是FindFirstFile函数、FindNextFile函数和WIN32_FIND_DATA结构。使用FindFirstFile和FindNextFile函数并与do-while循环结合,可以完成遍历目录的任务。
值得一提的是,FindFirstFile输入参数的路径需使用通配符,也就是用户可以根据一些条件来对查找的文件作简单的过滤。下面实例讲解查找特定目录下的所有文件和文件夹。读者可根据自己的需要,指定查找文件的条件。

 

(1)FindFirstFile。
查找第一个目录或文件,获取查找句柄

◇参数
lpFileName:输入参数,查找的目录,需使用通配符指定查找的文件目标。
lpFindFileData:输出参数,指向WIN32_FIND_DATA结构的指针,为找到的文件及其若干属性信息。
◇返回值
返回HANDLE值,如果执行失败,返回1NVALID HANDLE VALUE,如果成功则返回查找句柄。
◇使用说明
如果查找文件需在循环中与FindNextFile配合使用,FindNextFile需要用到FindFirstFile返回的句柄

 

(2)FindNextFile
对文件、文件夹进行循环查找,

◇参数
hFindFile:输入参数,查找句柄,由FindFirstFile返回。
lpFindFileData:输出参数,指向WIN32_FIND_DATA结构的指针,为找到的文件及其若干属性信息。
◇返回值
返回BOOL值,表示是否成功。
◇使用说明
需循环查找。

 

WIN32_FIND_DATA结构用于表示找到的文件,结构中包括文件、目录的名字,创建、最后访问和最后写入时间,文件大小、文件属性等。

 

>>>本实例实现了对指定目录中文件和子目录的遍历,并将遍历得到的文件和其他属性打印到界面上。

 

 

复制代码
 1 #include <Windows.h>
 2 #include <stdio.h>
 3 
 4 DWORD EnumerateFileInDrectory(LPSTR szPath)
 5 {
 6     WIN32_FIND_DATA FindFileData;
 7     HANDLE hListFile;
 8     CHAR szFilePath[MAX_PATH];
 9 
10     //构造代表子目录和文件夹路径的字符串,使用通配符“*”
11     lstrcpyA(szFilePath,szPath);
12         
13     //注释的代码可用于查找所有以".txt"结尾的文件
14     //lstrcatA(szFilePath,"\\*.txt");
15     lstrcatA(szFilePath,"\\*");
16     hListFile=FindFirstFile(szFilePath,&FindFileData);
17     //判断句柄
18     if(hListFile==INVALID_HANDLE_VALUE)
19     {
20         printf("错误: %d\n",GetLastError());
21         return 1;
22     }
23     else
24     {
25         do
26         {
27             /*如果不想显示代表本级目录和上级目录的"."和"..",
28             可以使用注释部分的代码过滤
29             if(lstrcmp(FindFileData.cFileName,TEXT("."))==0 ||
30                 lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
31             {
32                 continue;
33             }
34             */
35             //打印文件名、目录名
36             printf("%s\t\t",FindFileData.cFileName);
37             //判断文件属性,是否为加密文件或文件夹
38             if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_ENCRYPTED)
39             {
40                 printf("<加密> ");
41             }
42             //判断文件属性,是否为隐藏文件或文件夹
43             if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_HIDDEN)
44             {
45                 printf("<隐藏> ");
46             }
47             //判断文件属性,是否为目录
48             if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_DIRECTORY)
49             {
50                 printf("<DIR> ");
51             }
52             //根据文件属性表中的内容自行添加、判断文件属性
53             printf("\n");
54         }while(FindNextFile(hListFile,&FindFileData));
55     }
56     return 0;
57 }
58 int main(int argc,PCHAR argv[])
59 {
60     if(argc==2)
61     {
62         EnumerateFileInDrectory(argv[1]);
63     }
64     else
65     {
66         CHAR szCurrentPath[MAX_PATH];
67         GetCurrentDirectoryA(MAX_PATH,szCurrentPath);
68         EnumerateFileInDrectory(szCurrentPath);
69     }
70     return 0;
71 }
复制代码

 

>>>在上个实例的基础上稍加改造,进行循环递归调用,采用树形结构深度遍历的方法。可以遍历指定目录中的所有文件、包括子目录中的文件。

 

复制代码
 1 #include <windows.h>
 2 #include <stdio.h>
 3 
 4 /* 预处理申明 */
 5 #pragma comment (lib, "User32.lib")
 6 
 7 /* 全局变量 */
 8 //记录所有的文件和目录数
 9 DWORD dwTotalFileNum = 0;
10 
11 /* ************************************
12 * DWORD ListAllFileInDrectory(LPSTR szPath)
13 * 功能    遍历目录及所有子目录,打印路径
14 * 参数    LPTSTR szPath,为需遍历的目录
15 * 返回值    0代表执行完成,1代码发生错误
16 **************************************/
17 DWORD ListAllFileInDrectory(LPSTR szPath)
18 {
19     CHAR szFilePath[MAX_PATH];
20 
21     WIN32_FIND_DATA FindFileData;
22     HANDLE hListFile;
23     CHAR szFullPath[MAX_PATH];
24 
25     //构造代表子目录和文件夹路径的字符串,使用通配符“*”
26     lstrcpyA(szFilePath, szPath);
27     lstrcatA(szFilePath, "\\*");
28     //查找第一个文件/目录,获得查找句柄
29     hListFile = FindFirstFile(szFilePath,&FindFileData);
30 
31     if(hListFile==INVALID_HANDLE_VALUE)
32     {
33         printf("错误:%d",GetLastError());
34         return 1;
35     }
36     else
37     {        
38         do
39         {
40             //    过滤“.”和“..”,不需要遍历
41             if(lstrcmp(FindFileData.cFileName,TEXT("."))==0||
42                 lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
43             {
44                 continue;
45             }
46             //构造成全路径
47             wsprintfA(szFullPath,"%s\\%s",
48                 szPath,FindFileData.cFileName);
49             dwTotalFileNum++;
50             //打印
51             printf("\n%d\t%s\t",dwTotalFileNum,szFullPath);
52 
53             //如果是目录,则递归调用,列举下级目录
54             if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
55             {
56                 printf("<DIR>");
57                 ListAllFileInDrectory(szFullPath);
58             }            
59         }
60         while(FindNextFile(hListFile, &FindFileData));
61     }
62     return 0;
63 }
64 int main(int argc, PCHAR argv[])
65 {    
66     if(argc == 2)//如果有直接调用
67     {
68         ListAllFileInDrectory(argv[1]);
69     }
70     else//如果没有输入就默认为exe所在处
71     {
72         CHAR szCurrentPath[MAX_PATH];
73         GetCurrentDirectory(MAX_PATH,szCurrentPath);
74         ListAllFileInDrectory(szCurrentPath);
75     }
76     return 0;
77 }
复制代码
相关文章
|
3月前
|
数据采集 存储 API
Python爬虫结合API接口批量获取PDF文件
Python爬虫结合API接口批量获取PDF文件
|
10月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
261 2
|
5月前
|
API 开发者 Python
深入研究:1688商品跨境属性API接口详解
本文介绍了如何通过 1688 商品跨境属性 API 获取商品的跨境相关数据,助力企业开展电商业务。文章分为三部分:引言阐述了接口的重要性及应用场景;接口概述详细说明了调用步骤,包括参数准备、签名生成、请求发送和响应处理;Python 请求示例提供了一个完整的代码实现,帮助开发者快速上手。示例代码涵盖了请求参数配置、签名生成逻辑以及使用 requests 库发送请求的过程,为实际应用提供了参考。
164 13
|
6月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
API 开发者 UED
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
通过学习API 13,我深入研究了**PreviewKit(文件预览服务)**。该模块支持快速预览多种文件类型(文本、图片、视频、音频、PDF等),为文件管理类应用提供系统级支持。本文分享了从搭建开发环境到实现单文件和多文件预览的全过程,并介绍了如何构建一个实用的文件预览助手应用。通过实践,不仅掌握了技术细节,还提升了个人开发能力。希望这些经验能为其他开发者带来启发与帮助。
191 10
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
|
6月前
|
自然语言处理 安全 API
1688 跨境属性 API 接口(1688API 系列)
1688跨境属性API助力跨境电商发展,提供商品目标市场适配、跨境物流、国际认证及语言文化属性等数据,支持HTTP GET/POST请求。开发者可通过商品ID、目标市场代码和语言参数精准获取信息,提升业务效率与精准度。示例代码展示了如何使用Python进行GET请求,获取商品跨境属性,确保数据准确可靠。
|
29天前
|
JSON API 数据格式
淘宝/天猫图片搜索API接口,json返回数据。
淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。
|
27天前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
1月前
|
监控 算法 API
电商API接口对接实录:淘宝优惠券接口对接处理促销监控系统
在电商开发中,淘宝详情页的“券后价计算”是极易出错的环节。本文作者结合实战经验,分享了因忽略满减券门槛、有效期、适用范围等导致的踩坑经历,并提供了完整的解决方案,包括淘宝API签名生成、券后价计算逻辑、常见坑点及优化建议,助力开发者精准实现券后价功能,避免业务损失。
|
1月前
|
JSON 算法 API
淘宝商品评论API接口核心解析,json数据返回
淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于: