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

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

 #include <Windows.h>
#include <stdio.h> DWORD EnumerateFileInDrectory(LPSTR szPath)
{
WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
CHAR szFilePath[MAX_PATH]; //构造代表子目录和文件夹路径的字符串,使用通配符“*”
lstrcpyA(szFilePath,szPath); //注释的代码可用于查找所有以".txt"结尾的文件
//lstrcatA(szFilePath,"\\*.txt");
lstrcatA(szFilePath,"\\*");
hListFile=FindFirstFile(szFilePath,&FindFileData);
//判断句柄
if(hListFile==INVALID_HANDLE_VALUE)
{
printf("错误: %d\n",GetLastError());
return ;
}
else
{
do
{
/*如果不想显示代表本级目录和上级目录的"."和"..",
可以使用注释部分的代码过滤
if(lstrcmp(FindFileData.cFileName,TEXT("."))==0 ||
lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
{
continue;
}
*/
//打印文件名、目录名
printf("%s\t\t",FindFileData.cFileName);
//判断文件属性,是否为加密文件或文件夹
if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_ENCRYPTED)
{
printf("<加密> ");
}
//判断文件属性,是否为隐藏文件或文件夹
if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_HIDDEN)
{
printf("<隐藏> ");
}
//判断文件属性,是否为目录
if(FindFileData.dwFileAttributes && FILE_ATTRIBUTE_DIRECTORY)
{
printf("<DIR> ");
}
//根据文件属性表中的内容自行添加、判断文件属性
printf("\n");
}while(FindNextFile(hListFile,&FindFileData));
}
return ;
}
int main(int argc,PCHAR argv[])
{
if(argc==)
{
EnumerateFileInDrectory(argv[]);
}
else
{
CHAR szCurrentPath[MAX_PATH];
GetCurrentDirectoryA(MAX_PATH,szCurrentPath);
EnumerateFileInDrectory(szCurrentPath);
}
return ;
}

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

 #include <windows.h>
#include <stdio.h> /* 预处理申明 */
#pragma comment (lib, "User32.lib") /* 全局变量 */
//记录所有的文件和目录数
DWORD dwTotalFileNum = ; /* ************************************
* DWORD ListAllFileInDrectory(LPSTR szPath)
* 功能 遍历目录及所有子目录,打印路径
* 参数 LPTSTR szPath,为需遍历的目录
* 返回值 0代表执行完成,1代码发生错误
**************************************/
DWORD ListAllFileInDrectory(LPSTR szPath)
{
CHAR szFilePath[MAX_PATH]; WIN32_FIND_DATA FindFileData;
HANDLE hListFile;
CHAR szFullPath[MAX_PATH]; //构造代表子目录和文件夹路径的字符串,使用通配符“*”
lstrcpyA(szFilePath, szPath);
lstrcatA(szFilePath, "\\*");
//查找第一个文件/目录,获得查找句柄
hListFile = FindFirstFile(szFilePath,&FindFileData); if(hListFile==INVALID_HANDLE_VALUE)
{
printf("错误:%d",GetLastError());
return ;
}
else
{
do
{
// 过滤“.”和“..”,不需要遍历
if(lstrcmp(FindFileData.cFileName,TEXT("."))==||
lstrcmp(FindFileData.cFileName,TEXT(".."))==)
{
continue;
}
//构造成全路径
wsprintfA(szFullPath,"%s\\%s",
szPath,FindFileData.cFileName);
dwTotalFileNum++;
//打印
printf("\n%d\t%s\t",dwTotalFileNum,szFullPath); //如果是目录,则递归调用,列举下级目录
if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
printf("<DIR>");
ListAllFileInDrectory(szFullPath);
}
}
while(FindNextFile(hListFile, &FindFileData));
}
return ;
}
int main(int argc, PCHAR argv[])
{
if(argc == )//如果有直接调用
{
ListAllFileInDrectory(argv[]);
}
else//如果没有输入就默认为exe所在处
{
CHAR szCurrentPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,szCurrentPath);
ListAllFileInDrectory(szCurrentPath);
}
return ;
}

[WinAPI] API 13 [遍历指定目录 打印文件和其他属性]的更多相关文章

  1. C#递归遍历指定目录下文件和文件夹

    #region 使用递归查询某路径中的文件结构 public static void CheckFilePath() { ReadFilePath(); } public static void Re ...

  2. delphi遍历指定目录下指定类型文件的函数

    遍历指定目录下指定类型文件的函数// ================================================================// 遍历某个文件夹下某种文件,/ ...

  3. Window Linux下实现指定目录内文件变更的监控方法

    转自:http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更,window 系统提供了两个未公开API ...

  4. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte

    File 类 用来将文件或者文件夹封装成对象 方便对文件与文件夹进行操作. File对象可以作为参数传递给流的构造函数 流只用操作数据,而封装数据的文件只能用File类 File类常见方法: 1.创建 ...

  5. PHP遍历指定目录,并存储目录内所有文件属性信息

    项目需要,需要写一个函数,能够遍历指定目录中的所有文件,而且这个目录中的子目录也要遍历.输出文件的属性信息,并存储. 想想需求,不就是一个ls -al命令吗,实现获取相关属性就好了,再加上一个遍历OK ...

  6. rsync 排除指定目录或文件进行同步

    很常见的情况:我想同步/myweb下的 一些php文件 ,  但是不想复制/myweb/log/里边的一些日志文件,因为这些文件太大了,备份也是没有意义的. 现在如果想避开某个路径  直接添加—exc ...

  7. Git如何检出指定目录或文件

    系统版本:Window 10,Git 版本:2.7.1 对于大型 Git 仓库,每次执行 Git 命令,都需要经过漫长的等待,特别是要经常执行的 git status 命令.下面是一个例子... 从 ...

  8. C#监控指定目录的文件变化的代码

    如下的资料是关于C#监控指定目录的文件变化的代码. FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = @" ...

  9. java统计指定目录中文件的个数和总的大小

    转: 统计指定目录中文件的个数和总的大小 package file; import java.io.File; import java.util.ArrayList; public class Fil ...

随机推荐

  1. cef3 获得 谷歌浏览器 网页源码 哈哈

    Get HTML Source from Chromium Embedded http://stackoverflow.com/questions/13324095/get-html-source-f ...

  2. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  3. json 特殊字符 javascript 特殊字符处理(转载)

    特殊字符以前都是禁止页面输入,这样就简单不容易出错,但最近需求要求能输入特殊字符整理出java返回json时特殊字符的转义(不转义会破坏json数据格式导致页面读取数据出错) Java代码 publi ...

  4. easyUI删除行的操作

    columns: [[ { field: 'KeyContent', title: '关键词' }, { field: 'ProductType', title: "用品/配件", ...

  5. 把表里的数据转换为insert 语句

    当表里面有数据时,怎么把表里的数据转换为insert 语句 (从别人那里看来的用SQLServer 2008 R2测试可用) CREATE PROC spGenInsertSQL @TableName ...

  6. 第一次正式小用Redis存储

    由于要做一个同一个页面上多种图表数据的下载,考虑到Azure上面的session很不稳定(可用Redis provider存储session,较稳定),故决定改为Azure支持的Redis,顺便也学习 ...

  7. C#数据库操作

    1.常用的T-Sql语句      查询:SELECT * FROM tb_test WHERE ID='1' AND name='xia'                SELECT * FROM ...

  8. ASP.NET ZERO 学习 事件总线

    用于注册和触发客户端的全局事件. 介绍 Pub/sub事件模型广泛用于客户端,ABP包含了一个简单的全局事件总线来 注册并 触发事件. 注册事件 可以使用abp.event.on来注册一个全局事件.一 ...

  9. 第三十八章 springboot+docker(maven)

    回顾上一章的整个部署过程: 使用"mvn install"进行打包jar 将jar移动到与Dockerfile文件相同的文件夹下 编写Dockerfile文件 使用"do ...

  10. ubuntu14.04 的网络配置

    为eth0 配置网络 vi /etc/network/intefaces 添加以下内容 auto eth0 iface eth0 inet static address 192.168.0.10 ne ...