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. windbg学习!vad

    在ring0 !address不能提供详细的信息了 可以尝试用下!vad !vad扩展显示一个或多个虚拟地址详细的虚拟地址描述符(virtual address descriptor (VAD)). ...

  2. noip2006 2^k进制数

    设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w ...

  3. 用定时器令P0(或其它IO口)产生多路方波

    void Timer0_isr(void) interrupt 1 using 1{ static unsigned char i;  //重新赋值 12M晶振计算,指令周期1uS,500x2=1mS ...

  4. 网络请求框架----HttpClient的get,post和图片上传服务器

    HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议.HttpCli ...

  5. Spring MVC 文件上传

    1.form的enctype=”multipart/form-data” 这个是上传文件必须的 2.applicationContext.xml中 <bean id=”multipartReso ...

  6. python第十一天-----补:线程池

    低版本: #!/usr/bin/env python import threading import time import queue class TreadPool: ""&q ...

  7. SegmentFault创始人高阳:辍学后带着500元北漂,4年建成国内最大开发者

    i黑马注:i黑马曾经和高阳聊过几次天,在他身上我看到了90后CEO特别明显的成功特质“敢为天下先”.在别人犹豫的时候敢第一个出手,在互联网时代往往会取得最关键的“先机优势”. 7月19日,“腾讯产品家 ...

  8. [转] linux虚拟带库操作笔记

    原文来自:“王旺的书房” ---- http://blog.itpub.net/271063/viewspace-1059840/ 分类: Linux 查看设备[root@node1 ~]# lssc ...

  9. Asp.net web api部署在某些服务器上老是404

    asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问,却又OK. 这时,便可以确定是WebAPI路由出了问题,经调 ...

  10. 图解——VS发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...