#include<windows.h>

#include<iostream>

#include<string>

using namespace std;

//只能处理目录:lpPath只能是路径

void find(char *lpPath)

{

char szFind[MAX_PATH];

char szFile[MAX_PATH];

WIN32_FIND_DATA FindFileData;

strcpy(szFind,lpPath);

strcat(szFind,"//*.*");

HANDLE hFind=::FindFirstFile(szFind,&FindFileData);

if(INVALID_HANDLE_VALUE == hFind)    return;

while(TRUE)

{

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

if(FindFileData.cFileName[0]!='.')

{

strcpy(szFile,lpPath);

strcat(szFile,"//");

strcat(szFile,FindFileData.cFileName);

find(szFile);

}

}

else

{

cout<<FindFileData.cFileName<<endl;

}

if(!FindNextFile(hFind,&FindFileData))

break;

}

FindClose(hFind);

}

//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符

void _find(string path){

//取路径名最后一个"//"之前的部分,包括"//"

string prefix=path.substr(0,path.find_last_of('//')+1);

WIN32_FIND_DATA FindFileData;

HANDLE hFind=::FindFirstFile(path.c_str(), &FindFileData);

if(INVALID_HANDLE_VALUE == hFind)

{

cout<<"文件通配符错误"<<endl;

return;

}

while(TRUE)

{

//目录

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

{

//不是当前目录,也不是父目录

if(FindFileData.cFileName[0]!='.')

{

//查找下一级目录

_find(prefix+FindFileData.cFileName+"//"+"*.*");

}

}

//文件

else

{

cout<<FindFileData.cFileName<<endl;

}

if(!FindNextFile(hFind,&FindFileData))

break;

}

FindClose(hFind);

}

void main(){

//find("E:");//目录:E盘

//_find("E://*.*");//E盘下所有文件

string str="./test"; //这里指定的是目录

//string path;

//cout<<"请输入文件通配符:"<<flush;

//cin>>path;

// str=str+path;

find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"

//_find(str);//可以处理"*","..//*" 不可以处理".",".."

system("pause");

}

复制代码

其中有个结构体,它是C++自带的,是这样的:

typedef struct _WIN32_FIND_DATA{

   DWORD dwFileAttributes; // 文件属性

   FILETIME ftCreationTime; // 文件创建时间

   FILETIME ftLastAccessTime; // 文件最后一次访问时间

   FILETIME ftLastWriteTime; // 文件最后一次修改时间

   DWORD nFileSizeHigh; // 文件长度高 32 位

   DWORD nFileSizeLow; // 文件长度低 32 位

   DWORD dwReserved0; // 系统保留

   DWORD dwReserved1; // 系统保留

   TCHAR cFileName[ MAX_PATH ]; // 长文件名

   TCHAR cAlternateFileName[ 14 ]; // 文件的可选名

} WIN32_FIND_DATA;

Win32下C++遍历目录和文件的源码的更多相关文章

  1. Linux下遍历目录及文件,更改权限

    Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...

  2. 【app】遍历目录所有文件

    遍历目录所有文件   原创,转载时请注明,谢谢.邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:htt ...

  3. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  4. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  5. Eclipse安装反编译插件,查看.class文件的源码

    2017-08-24 这样我们就可以通过Eclipse查看.class文件的源码了. 1.参考别人的博客,亲测有效 https://www.cnblogs.com/JealousGirl/p/setu ...

  6. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...

  7. Django的settings文件部分源码分析

    Django的settings文件部分源码分析 在编写Django项目的过程中, 其中一个非常强大的功能就是我们可以在settings文件配置许多选项来完成我们预期的功能, 并且这些配置还必须大写, ...

  8. eclipse查看class文件的源码

    eclipse查看class文件的源码: 1.网上下载jadClipse的jar包和执行文件jad.exe和 net.sf.jadclipse_3.3.0.jar. 2.把上面下载的jar包放在ecp ...

  9. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

随机推荐

  1. unity3d银联支付出现闪退

    在接入银联SDK的unity3d的游戏中,点击银联支付会出现游戏总是出现闪退现象 ,后来网上有资料说 打开银联的jar包,将里面的res/drawable目录下的文件,拷贝到您的工程的drawable ...

  2. [转]Net Framework引路蜂地图开发示例

    From:http://www.2cto.com/kf/201207/140421.html 引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台 ...

  3. IEnumerable和IEnumerator 详解 【转】

    初学C#的时候,老是被IEnumerable.IEnumerator.ICollection等这样的接口弄的糊里糊涂,我觉得有必要切底的弄清楚IEnumerable和IEnumerator的本质. 下 ...

  4. 大数据Lambda架构

    1 Lambda架构介绍 Lambda架构划分为三层.各自是批处理层,服务层,和加速层.终于实现的效果,能够使用以下的表达式来说明. query = function(alldata) 1.1 批处理 ...

  5. SQL 数据类型、约束、索引及视图

    一.数据类型:整数:int,bigint,smallint小数:float,real,decimal(长度,精度),numeric(长度,精度)字符:char(n),varchar(n) 8000英文 ...

  6. java 获取两个日期相差的毫秒数

    方法一可以使用date的getTime()方法来将当前日期格式的时间转换为毫秒数,进而相减. long systime = new Date().getTime();//当前系统时间        l ...

  7. CRM Entity 之Money转string int类型等

    Money转string 左右都是string //服务站地址 vehicleDetail["yt_servicestation_address"]=serviceStationC ...

  8. linux可执行文件目录的区别

    /bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件一般 ...

  9. 将控制台程序做成windows服务

    一:添加windows服务 二:修改XXXInstaller1的StartType=Automatic,修改ProcessInstaller1的Account=LocalSystem 三:在progr ...

  10. PHP中计算时间差(上周,上月,去年,昨天等)

    运用了date()和strtotime()函数,直接上代码 echo date('Y-m-d' , strtotime('-1 day')).PHP_EOL; echo date('Y-m-d' , ...