递归系统盘搜索文件

说明:
1.统计C盘的文件夹和文件的个数。
2.搜索某一类文件。如“ntdll”。


步骤:
1.明白要搜索哪个磁盘、哪一类文件。
2.利用函数不断搜索目录,FindFirstFileW()。
注意点:文件路径的格式 C:\\ *.*.
若只直接给出C:,必须加上\\,进行标准格式化。
3.pFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY。
若是文件夹进行递归,不断搜索。
注意:使用& 。而不是 ==。因为FILE_ATTRIBUTE_DIRECTORY只是其中的一种属性。
4.进行粗糙匹配。只要含有要搜索的名。直接输出
if (wcsstr(pFindData.cFileName, wstrSearchFileName.c_str()) != nullptr)
pFindData.cFileName 只包含每个文件的名称。不是路径

_WIN32_FIND_DATAW 结构体原型:
typedef struct _WIN32_FIND_DATAW {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[ MAX_PATH ];
WCHAR cAlternateFileName[ 14 ];
#ifdef _MAC
DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;


注意点:
1.WIN32_FIND_DATAW 此结构体的属性cFileName 不是真实的字符串,要使用cFileName.c_str().
2.‘.’代表本级目录,".."代表上一级级目录。搜索时要进行判断,并去除

//源代码
#include "stdafx.h" #include <Windows.h> #include <stdlib.h> #include <iostream> using namespace std; //文件路径标准化 "C:\\" wstring MakeStdName( wstring &wstrFileName) { if (wstrFileName.back() != '\\') { return (wstrFileName + L"\\"); } else return wstrFileName; } UINT g_uNum = 0, //文件数目 g_uFileNum=0; //文件夹数目 //递归,找到一个文件夹,递归进去继续找文件 UINT MyFindFile(wstring &wstrBeginDirName, wstring &wstrSearchFileName,const wstring wstrFilte=L"*.*") { WIN32_FIND_DATAW pFindData = { 0 }; HANDLE hFile = FindFirstFileW( (MakeStdName(wstrBeginDirName)+wstrFilte).c_str(), &pFindData); if (!hFile) { wprintf(L"Error!"); return 0; } do { //'.'代表本级目录 if (wcscmp(pFindData.cFileName, L".") == 0) continue; //'..'代表上一级目录 if (wcscmp(pFindData.cFileName, L"..") == 0) continue; //FILE_ATTRIBUTE_DIRECTORY 只是结构属性的一种,不可以你用== if (pFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { MyFindFile(MakeStdName(wstrBeginDirName) + pFindData.cFileName, wstrSearchFileName); //printf("文件夹名:%ls\r\n", (MakeStdName(wstrBeginDirName) + pFindData.cFileName).c_str()); ++g_uFileNum; } else { //粗糙匹配 if (wcsstr(pFindData.cFileName, wstrSearchFileName.c_str()) != nullptr) { printf("文件名:%ls\r\n", (MakeStdName(wstrBeginDirName) + pFindData.cFileName).c_str()); ++g_uNum; } } } while (FindNextFileW(hFile, &pFindData)); return g_uNum; } int _tmain(int argc, _TCHAR* argv[]) { //计时 DWORD dwBeginTime = GetTickCount(); //C盘 wstring wstrBeginDirName=L"C:"; //查找的文件名 wstring wstrSearchFileName = L"ntdll"; g_uNum =MyFindFile(wstrBeginDirName, wstrSearchFileName); printf("文件夹个数:%d,ntdll文件个数: %d\r\n", g_uFileNum,g_uNum); DWORD dwTime = GetTickCount() - dwBeginTime; printf("共用%d秒\r\n", dwTime / 1000); system("pause"); return 0; }

 

posted @ 2017-09-25 11:59  gd_沐辰  阅读(333)  评论(0编辑  收藏  举报