吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4988|回复: 17
收起左侧

[原创工具] 额,谁都可以写的文件夹变动检测

[复制链接]
我的爱是你 发表于 2020-4-17 23:17
本帖最后由 我的爱是你 于 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;
}

1.jpg
注:使用方法 ::需要检测哪个文件夹 就把exe 丢在哪个文件中后双击运行即可,文件减少 增加 都会 咚 一下。
不知为何我vs2019目标平台只有win10,所以代码放这了需要可以自己编译 。
当然很辣眼睛毕竟新手作,你们有心情的话自己可以改改。

文件夹变化监测.zip

7.8 KB, 下载次数: 31, 下载积分: 吾爱币 -2 CB

很垃圾win10家庭运行无问题软件大小15kb

免费评分

参与人数 4吾爱币 +9 热心值 +4 收起 理由
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
big-bug + 1 + 1 我很赞同!
lin_xop + 1 + 1 热心回复!
nextars + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2020-4-18 03:01

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
我的爱是你 + 2 + 1 好吧,昨晚写时要知道这玩意单实现检测功能我就不便利了。

查看全部评分

 楼主| 我的爱是你 发表于 2020-4-18 01:32
本帖最后由 我的爱是你 于 2020-4-18 01:36 编辑

在此代码基础上如需要可以很简单的添加 统计文件个数  输出新添加的文件的路径还有名字 是否删除  被删除的文件名字 输出修改日志之类的小功能。毕竟都没啥技术含量初学者可以看着搞。
思念曹操 发表于 2020-4-17 23:28
Xw丶小威 发表于 2020-4-17 23:47
我给同事写了检测目录变化的。用于统计目录下文件数量。有时间可以放出来大家耍耍
big-bug 发表于 2020-4-18 00:04
求软件的老哥是不是玩某硬核游戏的
NaiveBlue 发表于 2020-4-18 04:29
可以提需求吗  就是可以检测 连接目录NAS上面的某个文件夹里面  是否新增了某个格式的文件,发现有新的这个格式的文件 进行提示的功能。
付国兵123 发表于 2020-4-18 07:01
这个带记录是谁拷贝移动文件。
 楼主| 我的爱是你 发表于 2020-4-18 09:11
好吧,再次回复,此效率过低如只需要检测文件夹变动可使用上面层主的api。遍历文件可以在代码添加某些小功能之外,对上面api并无优势。
高大树 发表于 2020-4-18 21:21
自动保存_20200418_211954.png

不会写软件,一般就用这两个来搞定
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表