实时监控文件操作
#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));
?? ?}
}
總結
- 上一篇: 大小端判断
- 下一篇: lru调度算法例题_嵌入式必会!C语言最