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. BIO、NIO、AIO入门认识

    同步.异步.阻塞.非阻塞概念理解. 同步: 比如在执行某个逻辑业务,在没有得到结果之前一直处于等待阻塞状态,得到结果后才继续执行 异步: 比如在执行某个逻辑业务,在没有得到结果可以去干其他的事情,等待 ...

  2. sudo: /etc/sudoers is world writable|给用户添加权限报错

    给用户添加权限时候出现:sudo: /etc/sudoers is world writable| sudo: /etc/sudoers is world writable解决方式: pkexec c ...

  3. 使用WebStorm上传本地项目到GitHub和GitLab

    在使用 WebStorm 上传本地项目到 GitHub 之前,先要做一些相关配置. 首先打开 WebStorm ,依次点击File -> Settings… 打开系统设置面板,在上面搜索 git ...

  4. 没有找到mfc100.dll

    转自VC错误:http://www.vcerror.com/?p=86 问题描述: 生成的exe文件在编译的时候会提示"没有找到mfc100.dll",这个时候需要更改配置为静态编 ...

  5. 杂项-日志:日志(log)

    ylbtech-杂项-日志:日志(log) 1.返回顶部 1. 概述 网络设备.系统及服务程序等,在运作时都会产生一个叫log的事件记录:每一行日志都记载着日期.时间.使用者及动作等相关操作的描述. ...

  6. http://www.narkii.com/club/forum-46-1.html 纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,

    http://www.narkii.com/club/forum-46-1.html  纳金学习论坛,主要是讨论一些unty3D方面的事情,技术栈比较前沿,

  7. HTML引入CSS的方法

    1.嵌入式 通过<style>标记,来引入CSS样式. 语法格式:<style type = “text/css”></style> 提示:<style> ...

  8. Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1

    Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...

  9. Neo4j全文检索

    全文检索基本概念 搜索 搜索这个行为是用户与搜索引擎的一次交互过程,用户需要找一些数据,他提供给搜索引擎一些约束条件.搜索引擎通过约束条件抽取一些结果给用户 搜索引擎 搜索引擎存在的目的是存储,查找和 ...

  10. LeetCode 38.报数(Python3)

    题目: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  "one 1& ...