狂自私

导航

visual studio 2022 编译出来的文件被删除 & 监视目录中的文件变更

监视目录中的文件变更

因为编译出来的exe被删除(猜测被删除)了,所以就想验证下是不是,代码如下:

//参考:https://zhuanlan.zhihu.com/p/493850984
// 监控文件变化.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <Windows.h>
#include <winbase.h>
#include <fileapi.h>
#include <iostream>
#include <string>
#include <ctime>
#include <array>

// 宽字节字符串转多字节字符串
void W2C(wchar_t* pwszSrc, int iSrcLen, char* pszDest, int iDestLen)
{
    ::RtlZeroMemory(pszDest, iDestLen);
    // 宽字节字符串转多字节字符串
    ::WideCharToMultiByte(CP_ACP,
        0,
        pwszSrc,
        (iSrcLen / 2),
        pszDest,
        iDestLen,
        NULL,
        NULL);
}

int main()
{
    bool watch_state{};
    std::string filePath;
    std::cout << "请输入目录路径,请确保目录路径正确,不需要输入末尾的斜杠:";
    std::getline(std::cin, filePath);
    if (filePath[filePath.size() - 1] != '\\') {
        filePath += "\\";
    }
    HANDLE hDirectory{ CreateFileA(filePath.c_str(),FILE_LIST_DIRECTORY,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,
        NULL)};
    BYTE* pBuf = new BYTE[2048];
    if (NULL == pBuf)
    {
        std::cout << "内存申请失败!" << std::endl;
        return 2;
    }
    FILE_NOTIFY_INFORMATION* pFileNotifyInfo = (FILE_NOTIFY_INFORMATION*)pBuf;
    DWORD in_MemorySize{2048};
    LPDWORD in_out_BytesReturned{ new DWORD{} };
    char szTemp[MAX_PATH] = { 0 };
    while (watch_state=ReadDirectoryChangesW(hDirectory, pFileNotifyInfo, in_MemorySize,true,
        FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE| FILE_NOTIFY_CHANGE_ATTRIBUTES,
        in_out_BytesReturned,
        nullptr,
        NULL))
    {
        W2C((wchar_t*)(&pFileNotifyInfo->FileName), pFileNotifyInfo->FileNameLength, szTemp, MAX_PATH);
        time_t now = time(0);
        if (GetLastError() == ERROR_INVALID_FUNCTION)
        {
            std::cout << "系统不支持!" << std::endl;
        }
        else if (watch_state == 0)
        {
            std::cout << "监控失败!" << std::endl;
        }
        else if (GetLastError() == ERROR_NOTIFY_ENUM_DIR)
        {
            std::cout << "内存溢出!" << std::endl;
        }
        else {

            if (pFileNotifyInfo->Action == FILE_ACTION_ADDED)
            {
                std::cout << ctime(&now) << "\t新增文件 : " << szTemp << std::endl;
            }
            else if (pFileNotifyInfo->Action == FILE_ACTION_REMOVED)
            {
                std::cout << ctime(&now) << "\t删除文件 : " << szTemp << std::endl;
            }
            else if (pFileNotifyInfo->Action == FILE_ACTION_MODIFIED)
            {
                std::cout << ctime(&now) << "\t修改文件 : " << szTemp << std::endl;
            }
            else if (pFileNotifyInfo->Action == FILE_ACTION_RENAMED_OLD_NAME) {
                std::cout << ctime(&now) << "\t重命名文件-旧名称: " << szTemp << std::endl;
            }
            else if (pFileNotifyInfo->Action == FILE_ACTION_RENAMED_NEW_NAME) {
                std::cout << ctime(&now) << "\t重命名文件-新名称: " << szTemp << std::endl;
            }
            else {
                std::cout << ctime(&now) << pFileNotifyInfo->Action <<"" << szTemp << std::endl;
            }
        }
    }
    // 关闭句柄, 释放内存
    ::CloseHandle(hDirectory);
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
View Code

 

 

参考如下:https://zhuanlan.zhihu.com/p/493850984

visual studio 2022 编译出来的文件被删除

确定是被删除了,那么极有可能就是杀毒软件搞的鬼,然而因为特殊原因,我不能退出杀毒软件,所以对目录做了如下权限拒绝操作:

 

杀软一般都是以system用户组来运行的。这样就解决了,编译出来的文件也没用被删除掉。

 

posted on 2022-08-29 13:58  狂自私  阅读(162)  评论(0编辑  收藏  举报