gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 29 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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 。

具体看代码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 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 %s\r\n" , 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;
}

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

原文链接:https://www.cnblogs.com/guolongzheng/p/9969746.html 。

最后此篇关于vc++ 监控指定路径下文件变化实现代码的文章就讲到这里了,如果你想了解更多关于vc++ 监控指定路径下文件变化实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com