首页

文章

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;
}
山东沃尔德集团集团所辖公司介绍 齐鲁银行无忧贷和市民贷哪个好 什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 法斗能活到多少岁? 什么叫单个存货项目 法国斗牛犬能活多久 电子化学品的主要分类及其特点是什么? 印刷电子特点 搬运服务费入什么科目 汽车喷漆烤漆房工作原理 ...藏宝阁不显示号上面的物品。只显示带在身上的装备~! 开搬运费需要什么科目 和她已经分手了三年了,可我每天都会去想她。去关注她朋友圈发的一切... 企业是什么公司 搬运费上什么会计科目 搬运费属于什么科目6 搬运费一般什么科目 有一种叫螳螂的昆虫经常出现在家中,有问 螳螂代表什么 对一个很珍惜的异性朋友的祝福 如何用短信向一名异性朋友传达思念? 老人最开心的时候是什么时候如题 谢谢了 张溪乡的人口数据 在VC++里有“未声明的变量”错误(我明明声明了的) strlen函数简介 西渡到上海南站要多久 dnf110级合金战士毕业装备-dnf110级版本合金战士毕业装备搭配推荐_百度... 淘宝开店成功后扣保证金吗?怎么扣? 挂烫机一定要排污水吗-挂烫机污水怎么排 7572 我用360手机助手 把电脑内的视频上传到手机上默认的存储位置是手... 2016年8月12日坐K284应在几号站台候车 可以帮我找一个带“汐颜”的诗句~~~吗?~~~ 鲁大师温度压力检测怎么看结果 一个极其伤感的QQ网名,采纳后高分奖励! 幻16烤鸡多少度正常 ...gtx970的显卡,奔腾e5500的处理器,一烤鸡就蓝屏,正常么 如何解决CPU使用率过高的问题? 我国业余群众乐团发展迅速,如何提高指挥业务水平? 永恒之塔从1级开始 说清楚哪地方打的快 永恒之塔 魔族杀星怎麽获得4000DP的螺旋斩?多少级的任务? 永恒之塔姆姆耕地调查任务 我要见恩人,只知道河南新乡监狱,怎么见 陈莉的人物生平
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com