vc++ 监控指定路径下文件变化实现代码分享!

参考MSDN文档

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw

https://docs.microsoft.com/zh-cn/windows/desktop/api/winnt/ns-winnt-_file_notify_information

具体看代码

  # include < iostream >   # include < windows.h >   # include < process.h >   # include < tchar.h >   # include < string >  using namespace std;  typedef void( * CHANGESCALLBACK)(const std::wstring strFileName);  /*  @ 监控指定目录下文件变化  @ strDirPath 需要监控的目录  @ dwChangesType 需要监控文件变化方式  @ onCallBack 变化后的回调处理函数   */  void CheckFilesChanges(const std::wstring strDirPath, DWORD dwChangesType, CHANGESCALLBACK onCallBack);  void PrintMsg(const std::wstring strFileName) {    wprintf_s(L "new add File:t %srn", strFileName.c_str());  }  void CheckFilesChanges(const std::wstring strDirPath, DWORD dwChangesType, CHANGESCALLBACK onCallBack) {    if (strDirPath.empty() || !onCallBack)      return;    HANDLE hDir = INVALID_HANDLE_VALUE;    BYTE lpBuffer[1024];    ZeroMemory(lpBuffer, 1024);    DWORD cbBytes = NULL;    BOOL isOk = FALSE;    FILE_NOTIFY_INFORMATION * pnotify = (FILE_NOTIFY_INFORMATION * )lpBuffer;    FILE_NOTIFY_INFORMATION * tmp;    ZeroMemory( & lpBuffer, sizeof(FILE_NOTIFY_INFORMATION));    hDir = CreateFile(strDirPath.c_str(), FILE_LIST_DIRECTORY,        FILE_SHARE_READ |        FILE_SHARE_WRITE |        FILE_SHARE_DELETE, NULL,        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS |        FILE_FLAG_OVERLAPPED, NULL);    if (INVALID_HANDLE_VALUE == hDir)      return;    while (true) {      isOk = ReadDirectoryChangesW(hDir, & lpBuffer,          sizeof(lpBuffer),          TRUE,          FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,           & cbBytes,          NULL,          NULL);      if (isOk) {        tmp = pnotify;        PWSTR fileName = nullptr;        std::wstring strFileName;        if (tmp->FileNameLength) {          DWORD dwLength = tmp->FileNameLength + 1;          fileName = new wchar_t[dwLength];          if (fileName) {            memset(fileName, 0, dwLength * 2);            memcpy(fileName, tmp->FileName, dwLength * 2);            strFileName = fileName;          }          if (fileName)            delete []fileName;        }        if (tmp->Action == dwChangesType) {          onCallBack(strFileName);        }        ZeroMemory(tmp, 1024);        /*switch (tmp->Action){        case FILE_ACTION_ADDED: //当前目录新增文件{        onCallBack(strFileName);        }break;           case FILE_ACTION_REMOVED:  //该文件已从目录中删除{        onCallBack(strFileName);        }        break;        case FILE_ACTION_MODIFIED: //该文件已被修改。也可以是时间戳或属性的更改{        onCallBack(strFileName);        }        break;        case FILE_ACTION_RENAMED_OLD_NAME: //该文件已重命名,这是旧名称。{        onCallBack(strFileName);        }        break;        case FILE_ACTION_RENAMED_NEW_NAME: //该文件已重命名,这是新名称。{        onCallBack(strFileName);        }        break;        default:        break;        }*/      }    }    CloseHandle(hDir);  }  unsigned int CALLBACK ThreadProc(void * arg) {    CheckFilesChanges(_T("E:\GoCode"), FILE_ACTION_ADDED, PrintMsg);    return 0;  }  int main(int argc, char * argv[]) {    HANDLE hThread = NULL;    hThread = (HANDLE)::_beginthreadex(nullptr, NULL, ThreadProc, NULL, NULL, NULL);    system("pause");    return 0;  }

好了这篇文章就介绍到这了,需要的朋友可以参考一下。

—-想了解vc++ 监控指定路径下文件变化实现代码分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482925.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐