#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));
}
}