Windows监控指定目录下的文件变化,支持模糊匹配

Windows监控指定目录下的文件变化,支持模糊匹配

#include <windows.h>
#include <stdio.h>
#include <iostream>

void watch_directory(LPCTSTR path, LPCTSTR filter);

int main(void)
{
          
   
    LPCTSTR path = L"C:\Users\Admin\Desktop\test\";  // 监视的文件夹路径
    //    C:UsersAdminDesktop	est
    LPCTSTR filter = L".txt";  // 匹配的文件后缀名

    watch_directory(path, filter);

    return 0;
}

void watch_directory(LPCTSTR path, LPCTSTR filter)
{
          
   
    HANDLE dir_handle;
    TCHAR buffer[MAX_PATH];
    DWORD bytes_returned;

    // 创建监视器
    dir_handle = FindFirstChangeNotification(path, TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES |
                                             FILE_NOTIFY_CHANGE_SIZE);
    if (dir_handle == INVALID_HANDLE_VALUE)
    {
          
   
        printf("ERROR: Failed to create directory watcher. Error code: %d
", GetLastError());
        return;
    }

    // 循环等待文件变化
    while (TRUE)
    {
          
   
        // 等待文件变化

        WaitForSingleObject(dir_handle, INFINITE);

        // 重置监视器
        if (FindNextChangeNotification(dir_handle) == FALSE)
        {
          
   
            printf("ERROR: Failed to reset directory watcher. Error code: %d
", GetLastError());
            return;
        }

        // 获取最新的文件变化信息
        if (ReadDirectoryChangesW(dir_handle, &buffer, sizeof(buffer), TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME, &bytes_returned, NULL, NULL) == FALSE)
        {
          
   
            printf("ERROR: Failed to read directory changes. Error code: %d
", GetLastError());
            return;
        }

        // 处理文件变化信息
        PFILE_NOTIFY_INFORMATION pinfo = (PFILE_NOTIFY_INFORMATION)&buffer;
        do
        {
          
   
            wchar_t a[MAX_PATH] = {
          
   0};
            memcpy_s(a, pinfo->FileNameLength, pinfo->FileName, pinfo->FileNameLength);
            if (wcsstr(a, filter) != NULL)
//            if (wcsstr(pinfo->FileName, filter) != NULL)
            {
          
   
                std::cout << __FUNCTION__ << __LINE__ << __FILE__ << std::endl;
                // 匹配到指定的文件,打印文件变化信息
                switch (pinfo->Action)
                {
          
   
                case FILE_ACTION_ADDED:
                    printf("File added: %ls
", pinfo->FileName);
                    break;
                case FILE_ACTION_REMOVED:
                    printf("File removed: %ls
", pinfo->FileName);
                    break;
                case FILE_ACTION_MODIFIED:
                    printf("File modified: %ls
", pinfo->FileName);
                    break;
                case FILE_ACTION_RENAMED_OLD_NAME:
                    printf("File renamed (old): %ls
", pinfo->FileName);
                    break;
                case FILE_ACTION_RENAMED_NEW_NAME:
                    printf("File renamed (new): %ls
", pinfo->FileName);
                    break;
                default:
                    printf("default
");
                    break;
                }
            }

            pinfo = (PFILE_NOTIFY_INFORMATION)((LPBYTE)pinfo + pinfo->NextEntryOffset);
        } while (pinfo->NextEntryOffset > 0);
    }

    // 关闭监视器
    FindCloseChangeNotification(dir_handle);
}

更多Windows的相关开发请点击观看我的博客

经验分享 程序员 微信小程序 职场和发展