查找第一个文件
在目录中查找其名字和属性与制定名字相匹配的第一条目录项。
HANDLE FindFirstFile(
LPCTSTR lpFileName, //要查找的文件的名字,支持通配符
LPWIN32_FIND_DATA lpFindData //被找到的文件信息
);
- 函数调用成功返回的是找到的第一个句柄,它可以用在FindNextFile和FindClose中,否则的话,返回-1。
- 这个函数会打开一个被找到的文件的句柄,并且返回其名字与指定模式相匹配的第一个文件的信息。一旦被建立,被找到的文件句柄就可以用来寻找其他与这个模式相匹配的文件(FindNextFile)。当这个句柄不再需要时,应该关闭。
WIN32_FIND_DATA 结构体如下:
typedef struct _WIN32_FIND_DATAA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
_Field_z_ CHAR cFileName[ MAX_PATH ];
_Field_z_ CHAR cAlternateFileName[ 14 ];
#ifdef _MAC
DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
_Field_z_ WCHAR cFileName[ MAX_PATH ];
_Field_z_ WCHAR cAlternateFileName[ 14 ];
#ifdef _MAC
DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
#ifdef UNICODE
typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;
#else
typedef WIN32_FIND_DATAA WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAA PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA;
#endif // UNICODE
查找下一个文件
这个函数是基于上一个函数调用成功的基础上的。是查找下一个匹配的文件。
BOOL FindNextFile(
HANDLE hFindNext, //这个参数是调用FindFirstFile之后返回的句柄
LPWIN32_FIND_DATA lpFindData //被找到的文件信息
);
- 当找到与在前面调用FindFirstFile函数中所建立的查找模式相匹配的下一个文件时,返回TRUE, 否则返回ERROR_NO_MORE_FILES。
- 当此接口只返回单个文件的信息时,若缓冲区中存放了几个可用来满足后面FindNextFile函数调用的文件,则实现结果是不定的。并且匹配结果也不能仅仅是根据名字来匹配,这个API不能用来进行基于属性的匹配。
- 当一个文件没有设置属性时,就返回常数FILE_ATTRIBUTES_NORMAL,并把该常数放在lpFileName所指定的数据结构的字段中。通过返回此函数,同样的数据结构接着可以用来为文件设置通常的文件属性。
查找指定文件
这个函数可以用来在指定路径下搜索文件,如果找到指定的文件,会返回文件的完整路径名。
这个函数可以用来计算出文件名部分在这个完整路径中的相对位置。
DWORD SearchPath(
LPCTSTR lpPath, //可选参数,如果给了,就在指定路径下查找,如果缺省了就用缺省的Windows搜索路径。
LPCTSTR lpFileName, //指定要查找的文件名
LPCTSTR lpExtension, //可选参数。扩展名,如果指定了这个参数,那么在搜索时要把这个扩展名加到文件名的后面,扩展名要是 . 开头的,并且只有在前面的文件名中不含扩展名的情况下才能把它加上
DWORD nBufferLength, //缓冲区大小
LPTSTR lpBuffer, //缓冲区,用来接收根据找到的文件所确定的完整路径名
LPTSTR lpFilePart //用来返回查找出的完整路径名后的最后一个成分的地址,即这个文件名的完整路径名的缓冲区中的地址。
);
- 函数的返回值是复制到参数lpBuffer中所指定的缓冲区中的字符串的长度。如果大于nBufferLength,那么返回值就是完整路径名需要的缓冲区的大小;调用失败会返回0
默认的搜索路径是:
- 应用程序的加载路径
- 当前目录
- Windows系统目录(可以用GetSystemDirectory获得该目录)
- Windows目录(可以用GetWindowsDirectory获得该目录)
- PATH环境参量中列出的目录
用法如下:
LPWSTR lpStr1 = new WCHAR[MAX_PATH];
if (lpStr1 != NULL)
{
LPTSTR* lpStr = new LPTSTR;
if (lpStr == NULL)
{
delete[] lpStr1;
return -1;
}
SearchPath(NULL, L"1", L".txt", MAX_PATH, lpStr1, lpStr);
delete[] lpStr1;
delete lpStr;
}
得到的结果:
- lpStr1 D:\vs_project\test1\Debug\1.txt
- lpStr 1.txt
查找结束
BOOL FindClose(
HANDLE hFindFile //在FindFirstFile中创建的查找文件的句柄用这个来关闭
);
一个实例
查找指定目录下的所有文件
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
void find(CString strPath, std::vector &fileList)
{
WIN32_FIND_DATA FindFileData;
CString strFind = strPath;
strFind += "\\*.*";
HANDLE hFind = ::FindFirstFile(strFind, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind) return;
while (true)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindFileData.cFileName[0] != '.')
{
CString strFile = strPath;
strFile += "\\";
strFile += FindFileData.cFileName;
find(strFile, fileList);
}
}
else
{
fileList.push_back(FindFileData.cFileName);
}
if (!FindNextFile(hFind, &FindFileData)) break;
}
FindClose(hFind);
}
int main()
{
std::vector fileList;//定义一个存放结果文件名称的链表
//遍历一次结果的所有文件,获取文件名列表
find(L"D:\\vs_project\\test1", fileList);//之后可对文件列表中的文件进行相应的操作
return 0;
}