#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. Linux中service命令和/etc/init.d/的关系

    Linux中service命令和/etc/init.d/的关系   service xxx启动 /etc/init.d/ 目录下的xxx脚本 如一个脚本名为 mysvc保存在/etc/init.d/下 ...

  2. swift 用协议实现代理传值功能

    1.功能简介 RootViewController中用个lable和一个按钮,点击按钮跳转到模态窗口.在模态窗口中有个TextField和一个按钮,输入文字点击关闭模态按钮后跳转到RootViewCo ...

  3. javascript高级知识点——指定上下文实现

    代码信息来自于http://ejohn.org/apps/learn/. 当我们将一个对象的点击事件绑定到一个事件触发元素时会发生什么? <ul id="results"&g ...

  4. Android 根据EditText搜索框ListView动态显示数据

    根据EditText搜索框ListView动态显示数据是根据需求来的,觉得这之中涉及的东西可能比较的有意思,所以动手来写一写,希望对大家有点帮助. 首先,我们来分析下整个过程: 1.建立一个layou ...

  5. 在 IIS 中配置 ASP.NET 应用程序

     注意事项: 1.注册.NET 如果先安装.net平台,后安装IIS,那么在IIS中可能就没有出现ASP.NET版本的下拉菜单,就要手动注册: 一般.Net版本都存放在:C:\WINDOWS\Micr ...

  6. iOS退出键盘的两种方式

    1,可以让叫出键盘的那个控件,退出第一响应者; 例如:textField叫出的键盘,那么就可以调用textField.resignFirstResponder,达到谁叫出的键盘谁退回去 2,可以让叫出 ...

  7. 随记1(#define a 10和const int a=10)

    正是求职笔试旺季,前几天听说有人遇到此题:#define a 10 和const int a=10的区别,废话不多说,下面来解释一下: #define 指令是定义符号常量 const   定义的是常变 ...

  8. leetcode Linked List Cycle python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

  9. 常用js表单文本域验证

    1.验证是否为正确的邮箱地址 注意:本方法只能验证以@a.b结尾的邮箱地址,对于三级及三级以上的邮箱,比如@iie.ac.cn结尾的会出现错误 function isEmail(o){ var reg ...

  10. iOS下移除按钮原生样式

    按钮样式,在 Android 手机浏览器中显示正常,但在 iOS Safari 浏览器中会看到按钮显示为圆角样式,设置 border-radius:0; 也不好使. 这是因为iPhone.iPad 设 ...