本帖最后由 我的爱是你 于 2020-4-17 23:23 编辑
之前有个论坛网友发帖求助 检测文件夹增多的工具,我回答了但其需求为软件必须响一下 随后我就不再关注此贴。
直到今天论坛网友再次发帖,我想了想实现此功能随便个C新手都可以做到。
作为新手我的思路
为遍历文件 将其全部保存,随后在预设时间后再次遍历进行对比,如改变则 咚 一下。
当然思路很多,像其他大佬写个hook啥的比我这个要好得多。
我缺点: 没写多线程 文件多的话 遍历时间增长 ,如你把软件往C盘根目录一放那你就等着吧。
下面是我代码:
[C++] 纯文本查看 复制代码 /*
对该软件所在目录所有文件进行记录 并延迟2秒后比较 如文件增加或减少则 咚 一下提示
注:cmd 打印数据为方便调试代码,如不想要则可以把下面的 cout 语句全部删除,删除后没有输出可能运行会更快一点
*/
#include <iostream>
using namespace std;
#include <Windows.h>
#include <vector>
#include <algorithm>
void Func_File(char szFindName[], vector<WIN32_FIND_DATAA>& container) {
WIN32_FIND_DATAA winFindData;
HANDLE hand;
char route[260] = { 0 };
char temp[260] = { 0 };
//strcpy_s(temp, sizeof(temp), szFindName);
_snprintf_c(route, 260, "%s\\*", szFindName);
cout << "当前查找路径: " << szFindName << endl;
hand = FindFirstFileA(route, &winFindData); //模糊查找所有文件
if (INVALID_HANDLE_VALUE == hand)
{
cout << "FindFistFile 失败\n";
return;
}
do{
if (!(FindNextFileA(hand, &winFindData))) {
cout << "查找文件无\n";
break;
}
if (!(winFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //文件属性以位表示。此意思为找到的是否为文件夹
{
cout << "文件:\t" << winFindData.cFileName << endl;
container.push_back(winFindData);
}
else if(winFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
cout << "文件夹:\t " << winFindData.cFileName << endl; //打印文件夹
container.push_back(winFindData);
if ((strcmp(winFindData.cFileName, ".")== 0) || (strcmp(winFindData.cFileName, "..")==0))
{
continue;
}
_snprintf_c(temp,sizeof(temp), "%s\\%s", szFindName,winFindData.cFileName);
Func_File(temp,container);
}
}while (hand != INVALID_HANDLE_VALUE);
FindClose(hand);
return;
}
void prin(WIN32_FIND_DATAA out) {
cout << out.cFileName << endl;
}
int main() {
int arr = 0;
char route[260] = { 0 };
vector<WIN32_FIND_DATAA> container,temp;
if (NULL != (GetCurrentDirectoryA(sizeof(route), route))) {
cout << "路径 : " << route << endl;
}
else {
cout << "当前路径获取失败\n";
}
Func_File(route,container);
cout << "分割线-----------------------------------\n";
//for_each(container.begin(), container.end(), prin);
while (1) {
Sleep(2000); //单位毫秒 此为延迟2秒可自己调
temp.clear();
Func_File(route, temp);
if (container.size() != temp.size())
{
arr++;
container = temp;
MessageBeep(0xffffffff); //简单的系统声音,如觉得不行可以拿API在这个位置替换掉它 换个播放音乐的
cout << "******** 第 " << arr << " 次文件数量或name改变 *********\n\n\n"; //进行计数省的声音不明显 使其不知晓改变
}
for (int i = 0; i < temp.size(); i++)
{
if (strcmp(container[i].cFileName,temp[i].cFileName)== 0)
{
continue;
}
else
{
arr++;
MessageBeep(0xffffffff); //简单的系统声音,同上改变
container = temp;
cout << "******** 第 " << arr << " 次文件数量或name改变 *********\n\n\n";
}
}
}
return 0;
}
注:使用方法 ::需要检测哪个文件夹 就把exe 丢在哪个文件中后双击运行即可,文件减少 增加 都会 咚 一下。
不知为何我vs2019目标平台只有win10,所以代码放这了需要可以自己编译 。
当然很辣眼睛毕竟新手作,你们有心情的话自己可以改改。
|