windows 遍历目录下的所有文件 FindFirstFile FindNextFile
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的更多相关文章
- C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)
本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...
- C/C++遍历目录下的所有文件(Windows篇,超详细)
注: 1. 本文讨论的是怎么用Windows API遍历目录下的所有文件.除Windows API,还有一种Windows/Linux通用的方式,使用<io.h>. 2. 本文部分翻译自M ...
- 用bash命令得到Windows一个目录下的所有文件并且把结果输入到一个文件
方式一: 只用如下一条语句就可以了: tree/f>index.txt 放入一个文件中命名为"****.bat" 双击就会在该目录下生成一个index.txt文件,在这个文件 ...
- C 给定路径遍历目录下的所有文件
在此之前需要了解 WIN32_FIND_DATA的结构 以及 FindFirstFile. FindNextFile原型以及用法注意事项传送门如下 https://msdn.microsoft.co ...
- php 遍历目录下的所以文件和文件夹
<?php/** * 遍历文件夹和文件列 * @author lizhiming * @date 2016/06/30 */define('DS', DIRECTORY_SEPARATOR); ...
- 遍历目录下的所有文件-os.walk
#coding:utf-8 import os for root,dirs,files in os.walk("D:"): for fileItem in files: print ...
- shell 遍历目录下的所有文件
dir=/usr/local/nginx/logs for file in $dir/*; do echo $file done //结果 ./test.sh /usr/local/nginx/log ...
- shell编程--遍历目录下的文件
假定目录text下有如下文件 目录:dir_1.dir_2.dir_3 文件:text_1.text_2 遍历目录下所有的文件是目录还是文件 if -- if类型: #!bin/sh for ...
- C++遍历路径下的所有文件
intptr_t类型用于记录文件夹句柄,注意该类型不是指针类型,而是int型的重定义. _finddata_t结构体类型用于记录文件信息. _finddata_t结构体定义如下 struct _fin ...
随机推荐
- SpringCloudConfig
方便服务配置文件统一管理,实时更新 组成 在spring cloud config组件中,分两个角色,一是config server,二是config client Config Server是一个可 ...
- Windows copy
将一份或多份文件复制到另一个位置. COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B] [+ source ...
- Oracle大数据SQL语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- csps模拟8990部分题解
题面: 666: 重点在题意转化:每个数可以乘k,代价为k,可以减一,代价为1, 所以跑最短路即可 #include<iostream> #include<cstdio> #i ...
- CF919D Substring (dag dp)
传送门 解题思路 感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次..),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可. 代码 #inc ...
- csdn的富文本编辑器(html)格式的文章,添加的代码格式粘贴到项目中总是不对,我这里是maven的pom文件。
在用富文本编辑器(html)格式编辑的时候,总是出现将pom文件的配置从csdn粘贴到项目中发现很多红,是因为自己在设置的时候有问题. 因为我们的是pom.xml,这里原来设置的java呀或者js为了 ...
- day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
- C#实现拍照并且存水印照片
由于一直在高校工作,就涉及到招生工作,招生时候又要收集学生图像采集,所以就随手写了一个图像采集工具,废话不多说,进入正题. 图像采集需要调用摄像头就行拍照操作,网上查了一下资料,需要引用以下3个dll ...
- JS动画完美框架
html部分 <!DOCTYPE html> <html lang="en"> <head> <link href="../cs ...
- Vue基础(1)
目录 Vue基础 基础 导入 1. 挂载 2. 插值表达式 3. 事件 4. 创建对象 5. v-text和v-html 6. vue的过滤器 7. 属性指令 Vue基础 基础 首先我们要知道Vue是 ...