Windows下遍历文件时用到的就是FindFirstFile 和FindNextFile 首先看一下定义:

HANDLE FindFirstFile(
LPCTSTR
lpFileName, // file name
LPWIN32_FIND_DATA lpFindFileData // data buffer
);
函数成功时,返回一个有效句柄,失败时返回INVALID_HANDLE_VALUE
参数说明:
lpFileName:文件名,可以用通配符来指定遍历的文件类型,例如*.*表示所有文件, *.txt表示匹配所有的文本文件。还可以用?,?表示任意一个字符
lpFindData:是一个WIN32_FIND_DATA的结构,该结构说明了遍历到文件或者子目录的的属性,看一下定义:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性,例如是目录还是文件, 是隐藏文件,加密文件, 只读文件等等
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh; //文件大小的高32位,一般为0,即不超过4GB
DWORD nFileSizeLow; //文件大小的低32位
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ]; //文件名,不包括路径
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
这个结构体的参数不多介绍了。
看下一个函数:
BOOL FindNextFile(
HANDLE
hFindFile, // search handle
LPWIN32_FIND_DATA lpFindFileData // data buffer
);参数说明:
hFindFile:为FindFirstFile返回的句柄, 第二个参数和前面的一样,
返回值:成功返回1,失败返回0. 调用GetLastError()可查看错误代码
这里写两个函数练习,
第一个将传入目录下的所有文件以及子目录下所有的文件都加上.temp
第二个函数将删除传入目录的所有文件以及子目录下所有的文件后缀名为.txt 的文件
void RenameAndDelFile(const string &strPath)
{
string strRawPath = strPath;
strRawPath.append("\\"); string strFindPath = strRawPath;
strFindPath.append("*.*"); WIN32_FIND_DATAA winFindData; HANDLE hTemp = FindFirstFileA(strFindPath.c_str(), &winFindData); if (INVALID_HANDLE_VALUE == hTemp)
return ;
while (FindNextFileA(hTemp, &winFindData))
{
string strOldName = winFindData.cFileName;
if ("." == strOldName || ".." == strOldName)
continue;
//如果是目录,则递归继续操作
if (winFindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
string strAgain = strPath;
strAgain.append("\\");
strAgain.append(winFindData.cFileName);
RenameAndDelFile(strAgain);
continue;
}
//获得绝对路径
strOldName = strRawPath;
strOldName.append(winFindData.cFileName);
string strNewName = strOldName;
strNewName.append(".temp");
//更名以及删除文件
rename(strOldName.c_str(), strNewName.c_str());
//DeleteFileA(strNewName.c_str());
}
FindClose(hTemp);
} void DeleteTXTFile(const string &strPath)
{
string strRawPath = strPath;
strRawPath.append("\\"); string strFindPath = strRawPath;
strFindPath.append("*.*"); WIN32_FIND_DATAA winFindData; HANDLE hTemp = FindFirstFileA(strFindPath.c_str(), &winFindData); if (INVALID_HANDLE_VALUE == hTemp)
return;
while (FindNextFileA(hTemp, &winFindData))
{
string strOldName = winFindData.cFileName;
if ("." == strOldName || ".." == strOldName)
continue;
//如果是目录,则递归继续操作
if (winFindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
string strAgain = strPath;
strAgain.append("\\");
strAgain.append(winFindData.cFileName);
DeleteTempFile(strAgain);
continue;
}
string strDel = strRawPath;
strDel.append(strOldName); char szDrive[MAX_PATH] = {0};
char szDir[MAX_PATH] = {0};
char szFileName[MAX_PATH] = {0};
char szExt[MAX_PATH] = {0};
_splitpath_s(strDel.c_str(), szDrive, MAX_PATH, szDir, MAX_PATH, szFileName, MAX_PATH, szExt, MAX_PATH);
if (strcmp(".txt", szExt) == 0)
DeleteFileA(strDel.c_str());
}
FindClose(hTemp); }

windows 遍历目录下的所有文件 FindFirstFile FindNextFile的更多相关文章

  1. C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)

    本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...

  2. C/C++遍历目录下的所有文件(Windows篇,超详细)

    注: 1. 本文讨论的是怎么用Windows API遍历目录下的所有文件.除Windows API,还有一种Windows/Linux通用的方式,使用<io.h>. 2. 本文部分翻译自M ...

  3. 用bash命令得到Windows一个目录下的所有文件并且把结果输入到一个文件

    方式一: 只用如下一条语句就可以了: tree/f>index.txt 放入一个文件中命名为"****.bat" 双击就会在该目录下生成一个index.txt文件,在这个文件 ...

  4. C 给定路径遍历目录下的所有文件

    在此之前需要了解 WIN32_FIND_DATA的结构 以及  FindFirstFile. FindNextFile原型以及用法注意事项传送门如下 https://msdn.microsoft.co ...

  5. php 遍历目录下的所以文件和文件夹

    <?php/** * 遍历文件夹和文件列 * @author lizhiming * @date 2016/06/30 */define('DS', DIRECTORY_SEPARATOR); ...

  6. 遍历目录下的所有文件-os.walk

    #coding:utf-8 import os for root,dirs,files in os.walk("D:"): for fileItem in files: print ...

  7. shell 遍历目录下的所有文件

    dir=/usr/local/nginx/logs for file in $dir/*; do echo $file done //结果 ./test.sh /usr/local/nginx/log ...

  8. shell编程--遍历目录下的文件

    假定目录text下有如下文件      目录:dir_1.dir_2.dir_3 文件:text_1.text_2 遍历目录下所有的文件是目录还是文件 if -- if类型: #!bin/sh for ...

  9. C++遍历路径下的所有文件

    intptr_t类型用于记录文件夹句柄,注意该类型不是指针类型,而是int型的重定义. _finddata_t结构体类型用于记录文件信息. _finddata_t结构体定义如下 struct _fin ...

随机推荐

  1. 在Spring-boot中,为@Value注解添加从数据库读取properties支持

    一般我们会把常用的属性放在工程的classpath文件夹中,以property,yaml或json的格式进行文件存储,便于Spring-boot在初始化时获取. @Value则是Spring一个非常有 ...

  2. thinkphp 默认值输出

    我们可以给变量输出提供默认值,例如: 大理石平台厂家 {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例如: {$ ...

  3. 尚学linux课程---5、linux操作系统介绍

    尚学linux课程---5.linux操作系统介绍 一.总结 一句话总结: centos开源免费,用的特别多 1.库是什么意思? 没有执行入口的应用程序 2.linux和window下的动态库文件是什 ...

  4. 在idesktop中加载天地图服务并叠加矢量数据

    在天地图中加载天地图在线服务,然后叠加上我们制作的专题图,可以查看制图效果. 以加载山东省天地图矢量地图服务为例: 服务地址: http://www.sdmap.gov.cn/tileservice/ ...

  5. SPSS分类分析:决策树

    SPSS分类分析:决策树 一.决策树(分析-分类-决策树) "决策树"过程创建基于树的分类模型.它将个案分为若干组,或根据自变量(预测变量)的值预测因变量(目标变量)的值.此过程为 ...

  6. 关于python3字符串中引号格式的看法,‘’,“”

    关于字符串中引号格式的看法 在python3中,字符串统一使用: ' ' 或  " "     来表示,两者没有什么区别. 但是在使用的过程中,可以注意一下使用的方式,可以提高编程 ...

  7. C#实现拍照并且存水印照片

    由于一直在高校工作,就涉及到招生工作,招生时候又要收集学生图像采集,所以就随手写了一个图像采集工具,废话不多说,进入正题. 图像采集需要调用摄像头就行拍照操作,网上查了一下资料,需要引用以下3个dll ...

  8. AQS(队列同步器)

    目录导引: 一.简介 二.源码解析(JDK8) 三.运用示例 一.简介 1.volatile volatile修饰的共享变量可以保证可见性和有序性(禁止指令重排序). 2.CAS: CAS的原理很简单 ...

  9. 最近开始学习python,学习到了关于web的内容。

    然而在win10中IIS发布CGI脚本的时候遇到了各种各样的问题. 如ISAPI和CGI限制,权限限制等等,一一的百度解决了,最后又出现了 HTTP 错误 502.2 - Bad Gateway Th ...

  10. 金融IT的算法要求

    岗位职责 1.负责宏观经济预测的算法研究 2.负责债券.股票.基金等品种的模型研究 3.负责持仓收益分析,及绩效归因等模型研究 任职要求 1.一般数学: 线性代数与矩阵运算 随机过程 微积分 概率论 ...