#include <iostream>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <utility>
#include <map>
using namespace std;
const int max_size = 102400000; //100M
map<int, pair<string, string>> fileInfoMap;
void FindFile(char * pFilePath)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[MAX_PATH + 1];// 指定路径
DWORD dwError;
strncpy(DirSpec, pFilePath, strlen(pFilePath) + 1);
strncat(DirSpec, "/*", 3);
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE){
cout << "无效文件句柄. 错误原因:" << GetLastError() << endl;
return;
}
else
{
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
// cout << "filename:" << FindFileData.cFileName << "\t";
// cout << "filesize:" << fileSize << endl;
int fileSize = FindFileData.nFileSizeLow;
if (fileSize > max_size)
{
fileInfoMap.insert(make_pair(fileSize, make_pair(FindFileData.cFileName, DirSpec)));
}
}
else if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
&& strcmp(FindFileData.cFileName, ".") != 0
&& strcmp(FindFileData.cFileName, "..") != 0)
{ //找到目录
char Dir[MAX_PATH + 1];
strcpy(Dir, pFilePath);
strncat(Dir, "/", 2);
strcat(Dir, FindFileData.cFileName);
FindFile(Dir);
}
while (FindNextFile(hFind, &FindFileData) != 0)
{
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{ //找到文件
int fileSize = FindFileData.nFileSizeLow;//文件大小
if (fileSize > max_size)
{
fileInfoMap.insert(make_pair(fileSize, make_pair(FindFileData.cFileName, DirSpec)));
}
}
else if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
&& strcmp(FindFileData.cFileName, ".") != 0
&& strcmp(FindFileData.cFileName, "..") != 0)
{ //找到目录
char Dir[MAX_PATH + 1];
strcpy(Dir, pFilePath);
strncat(Dir, "/", 2);
strcat(Dir, FindFileData.cFileName);
FindFile(Dir);
}
}
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
printf("FindNextFile error. Error is %u ", dwError);
return;
}
}
}
int main()
{
FindFile("D:");
FindFile("E:");
map<int, pair<string, string>>::iterator myiter = fileInfoMap.begin();
for ( ; myiter != fileInfoMap.end(); ++myiter)
{
cout << "size: " << myiter->first << " "
<< "name:" << myiter->second.first << " "
<< "path:" << myiter->second.second << endl;
}
system("pause");
}
查找系统中的大文件(Windows) C++程序
最新推荐文章于 2025-05-12 10:04:19 发布