问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VC++ 全盘搜索指定文件,如果存在获取完整路径!

发布网友 发布时间:2024-10-24 13:10

我来回答

1个回答

热心网友 时间:2024-10-28 13:17

哈哈,前段时间才写了个类似程序,他的功能更加复杂,就随便把代码改改给你啦
这个代码是该的,所以你还是可以优化下性能的(win7下第一次跑很慢的)
上面写了一大段代码,使用方法全部在Test函数中。
懒得写注释了,也没啥可注释的,有啥不懂的直接问。
# include <vector>
# include <algorithm>

struct FileNameAndTime
{
wchar_t szPath[MAX_PATH]; //file directory
wchar_t szName[MAX_PATH]; //file name
FILETIME lastAcc; //last access time

FileNameAndTime()
{
memset(&lastAcc, 0, sizeof(lastAcc));
memset(szName, 0, sizeof(wchar_t) * MAX_PATH);
memset(szPath, 0, sizeof(wchar_t) * MAX_PATH);
}

FileNameAndTime(const PWCHAR fn, const PWCHAR pa, const LPFILETIME ft)
{
if( (0 == fn) || (0 == pa) || (0 == ft) )
return;
memcpy(&lastAcc, ft, sizeof(lastAcc));
wcscpy(szName, fn);
wcscpy(szPath, pa);
}

FileNameAndTime(const FileNameAndTime& fnd)
{
memcpy(&this->lastAcc, &fnd.lastAcc, sizeof(this->lastAcc));
wcscpy(this->szName, fnd.szName);
wcscpy(this->szPath, fnd.szPath);
}

const FileNameAndTime& operator=(const FileNameAndTime& fnd)
{
if(this != &fnd) {
memcpy(&this->lastAcc, &fnd.lastAcc, sizeof(this->lastAcc));
wcscpy(this->szName, fnd.szName);
wcscpy(this->szPath, fnd.szPath);
}
return *this;
}
void GetFullPath( wchar_t (&fp)[MAX_PATH] ) const
{
wcscpy(fp, szPath);
wcscat(fp, szName);
}
friend bool operator>(const FileNameAndTime& l, const FileNameAndTime& r); //compare this object by access time
};

bool operator<(const FileNameAndTime& l, const FileNameAndTime& r) //for sort
{
if(l.lastAcc.dwHighDateTime < r.lastAcc.dwHighDateTime)
return true;
else if (l.lastAcc.dwHighDateTime == r.lastAcc.dwHighDateTime)
{
if(l.lastAcc.dwLowDateTime < r.lastAcc.dwLowDateTime)
return true;
}
return false;
}

class FileOfDirectory
{
private:
static const wchar_t szDot[];
static const wchar_t szDotDot[];
static const wchar_t cStar;
static const wchar_t cSlash;
private:
std::vector<FileNameAndTime> vecFT;
wchar_t szCurrentPath[MAX_PATH];
wchar_t szSearchFileName[MAX_PATH];
private:
void validatePath(const wchar_t* pPath)
{
wcscpy(szCurrentPath, pPath);
int len = wcslen(szCurrentPath);
if( (cStar != szCurrentPath[len - 1])
&& (cSlash != szCurrentPath[len - 2]) )
{
szCurrentPath[len] = cSlash;
szCurrentPath[len + 1] = cStar;
szCurrentPath[len + 2] = 0;
return;
}
if( (cStar != szCurrentPath[len - 1])
&& (cSlash == szCurrentPath[len - 2]) )
{
szCurrentPath[len] = cStar;
szCurrentPath[len + 1] = 0;
return;
}
}
void detectFiles(const LPWSTR szDir)
{
WIN32_FIND_DATA ffd;
HANDLE hFind = ::FindFirstFile(szDir, &ffd);
if (INVALID_HANDLE_VALUE == hFind)
return ;
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if( (0 == wcscmp(ffd.cFileName, szDot)) || (0 == wcscmp(ffd.cFileName, szDotDot)))
continue;
else
{
wchar_t szTempPath[MAX_PATH];
wcscpy(szTempPath, szDir);
szTempPath[wcslen(szTempPath) - 1] = 0;
wcscat(szTempPath, ffd.cFileName);
int len = wcslen(szTempPath);
szTempPath[len] = cSlash;
szTempPath[len + 1] = cStar;
szTempPath[len + 2] = 0;
detectFiles(szTempPath);
}
}
else {
wchar_t path[MAX_PATH];
wcscpy(path, ffd.cFileName);
CharLower(path);
if(0 == wcscmp(path,szSearchFileName))
{
wcscpy(path, szDir);
path[wcslen(szDir) - 1] = 0;
vecFT.push_back(FileNameAndTime(ffd.cFileName,path, &ffd.ftLastAccessTime));
}
}
}
while (::FindNextFile(hFind, &ffd) != 0);
}
public:
FileOfDirectory(const LPWSTR szDir)
{
validatePath(szDir);
detectFiles(szCurrentPath);
}
FileOfDirectory()
{
static const wchar_t target[] = L"ent.cpp";
wcscpy(szSearchFileName, target);
CharLower(szSearchFileName);

wchar_t diskName[] = L"A:";
ULONG uDriveMask = _getdrives();
for(int i = 0; i < sizeof(ULONG); ++i)
{
if( 0 != (uDriveMask & 1) )
{
validatePath(diskName);
detectFiles(szCurrentPath);
}
++diskName[0];
uDriveMask >>= 1;
}
}
int NumOfFiles() const { return vecFT.size(); }
FileNameAndTime& operator[](int index)
{
if( (index >= 0) && (index < vecFT.size()) )
return vecFT[index];
}
};
const wchar_t FileOfDirectory::szDot[] = L".";
const wchar_t FileOfDirectory::szDotDot[] = L"..";
const wchar_t FileOfDirectory::cStar = L'*';
const wchar_t FileOfDirectory::cSlash = L'\\';

void Test()
{
FileOfDirectory fd;
int num = fd.NumOfFiles();

int szLen = 200 * MAX_PATH;
wchar_t *pstr = new wchar_t[szLen];
memset(pstr, 0, sizeof(wchar_t) * szLen);
wchar_t temp[MAX_PATH];
for(int i = 0; i < num; ++i) {
fd[i].GetFullPath(temp);
wcscat(pstr, temp);
wcscat(pstr, L"\r\n");
}

::MessageBox(0, pstr, 0, 0);
delete []pstr;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
amd锐龙r75700g超频性价比装机方案,要核显性能综合表现超 架空电线故障如何排除 ...unexpected T_CONSTANT_ENCAPSED_STRING in 怎么解决这个错啊_百度... php错误Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_S... PHP出现如下情况 syntax error, unexpected T_ENCAPSED_AND_WHITES... php 如何捕获类似于Parse error: syntax error, unexpected T_CONSTA... 挂烫机如何熨西装 戗驳领西装怎么熨烫 西装前片怎么推拉拔烫 西装能不能拿去烫 法斗能活到多少岁? 什么叫单个存货项目 法国斗牛犬能活多久 电子化学品的主要分类及其特点是什么? 印刷电子特点 搬运服务费入什么科目 汽车喷漆烤漆房工作原理 ...藏宝阁不显示号上面的物品。只显示带在身上的装备~! 开搬运费需要什么科目 和她已经分手了三年了,可我每天都会去想她。去关注她朋友圈发的一切... 企业是什么公司 搬运费上什么会计科目 搬运费属于什么科目6 搬运费一般什么科目 有一种叫螳螂的昆虫经常出现在家中,有问 螳螂代表什么 对一个很珍惜的异性朋友的祝福 如何用短信向一名异性朋友传达思念? 老人最开心的时候是什么时候如题 谢谢了 张溪乡的人口数据 在VC++里有“未声明的变量”错误(我明明声明了的) strlen函数简介 西渡到上海南站要多久 dnf110级合金战士毕业装备-dnf110级版本合金战士毕业装备搭配推荐_百度... 淘宝开店成功后扣保证金吗?怎么扣? 挂烫机一定要排污水吗-挂烫机污水怎么排 7572 我用360手机助手 把电脑内的视频上传到手机上默认的存储位置是手... 2016年8月12日坐K284应在几号站台候车 可以帮我找一个带“汐颜”的诗句~~~吗?~~~ 鲁大师温度压力检测怎么看结果 一个极其伤感的QQ网名,采纳后高分奖励! 幻16烤鸡多少度正常 ...gtx970的显卡,奔腾e5500的处理器,一烤鸡就蓝屏,正常么 如何解决CPU使用率过高的问题? 我国业余群众乐团发展迅速,如何提高指挥业务水平? 永恒之塔从1级开始 说清楚哪地方打的快 永恒之塔 魔族杀星怎麽获得4000DP的螺旋斩?多少级的任务? 永恒之塔姆姆耕地调查任务 我要见恩人,只知道河南新乡监狱,怎么见 陈莉的人物生平