实时监控文件操作

#include <iostream>
#include <windows.h>
#include <thread>
#include <vector>

#define BUFFER_SIZE 2048

std::vector<char>g_buffers;


// 监控函数
BOOL MonitorFile(std::wstring&path) {

    PTCHAR pszDirectory =(PTCHAR)(path.c_str());
    // 打开目录, 获取文件句柄
    HANDLE hDirectory = ::CreateFile(pszDirectory, FILE_LIST_DIRECTORY,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (INVALID_HANDLE_VALUE == hDirectory){
        return FALSE;
    }

    BOOL bRet = FALSE;
    DWORD dwRet = 0;

    do
    {
        // 得到 缓冲区
        RtlZeroMemory(&g_buffers[0], BUFFER_SIZE);
        PFILE_NOTIFY_INFORMATION pFileNotifyInfo = (PFILE_NOTIFY_INFORMATION)&g_buffers[0];

        // 设置监控目录
        bRet = ::ReadDirectoryChangesW(hDirectory,
            pFileNotifyInfo,
            BUFFER_SIZE,
            TRUE,
            FILE_NOTIFY_CHANGE_FILE_NAME |            // 修改文件名
            FILE_NOTIFY_CHANGE_DIR_NAME |           // 修改文件夹名
            FILE_NOTIFY_CHANGE_ATTRIBUTES |            // 修改文件属性
            FILE_NOTIFY_CHANGE_LAST_WRITE,            // 最后一次写入
            &dwRet,
            NULL,
            NULL);
        if (FALSE == bRet){
            break;
        }
        // 判断操作类型并显示
        switch (pFileNotifyInfo->Action)
        {
        case FILE_ACTION_ADDED:
        {
            // 新增文件
            std::cout << "新增文件" << std::endl;
            break;
        }
        case FILE_ACTION_REMOVED:
        {
            // 移动文件
            std::cout << "移动文件" << std::endl;
            break;
        }
        case FILE_ACTION_MODIFIED:
        {
            // 修改文件
            std::cout << "修改文件" << std::endl;
            break;
        }
        case FILE_ACTION_RENAMED_OLD_NAME:
        {
            // 重命名文件
            // 由于pFileNotifyInfo不是以零结尾的字符串 所以需要这么处理
            std::cout << "重命名" << std::endl;
            break;
        }
        default:
        {
            break;
        }
        }

    } while (bRet);


    // 关闭句柄, 释放内存
    ::CloseHandle(hDirectory);

    return TRUE;
}

int main()
{
    std::wstring path = L"F:/";
    g_buffers.resize(BUFFER_SIZE);
    std::thread t(MonitorFile,std::ref(path));
    
    while (1){
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_53332653/article/details/115136573
今日推荐