21xrx.com
2025-03-22 18:31:13 Saturday
文章检索 我的文章 写文章
C语言与VC++实现指定路径下文件的实时监控代码
2023-07-05 05:14:04 深夜i     11     0
C语言 VC++ 指定路径 实时监控 代码

随着计算机科学技术的不断发展和应用范围的扩大,实时文件监控系统得到了广泛的应用。实时文件监控系统能够监视指定路径下的文件的变化,比如增加、删除、修改等操作。本文介绍了如何利用C语言与VC++实现指定路径下文件的实时监控代码。

实现步骤:

1. 申请一个文件夹的句柄,开始实时监控。

2. 通过FindFirstChangeNotification()函数获取监控句柄。

3. 通过内核对象WaitForMultipleObjects()函数来等待句柄状态的变化。

4. 通过FindNextChangeNotification()函数获取下一个状态的变化,并且获取变化的类型。

5. 给用户提供相关反应。

下面是一个实现文件夹实时监控的C++代码示例:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
  HANDLE hFile;
  TCHAR lpFileName[] = _T("C:\\test\\");
  hFile = ::CreateFile(lpFileName, FILE_LIST_DIRECTORY,
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
      NULL, OPEN_EXISTING,
      FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
      NULL);
  if (hFile == INVALID_HANDLE_VALUE)
  {
    DWORD dwError = GetLastError();
    printf("CreateFile failed with error %d\n", dwError);
    return 1;
  }
  DWORD dwBytes;
  CHAR lpBuffer[8192] = { 0 };
  LPVOID lpMsgBuf;
  TCHAR szDir[MAX_PATH];
  HANDLE dwChangeHandles[2];
  DWORD dwWaitStatus;
  OVERLAPPED sOverlapped;
  dwChangeHandles[0] = hFile;
  dwChangeHandles[1] = sOverlapped.hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
  while (TRUE)
  {
    printf("Waiting for notification...\n");
    dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE);
    if (dwWaitStatus == WAIT_OBJECT_0)
    {
      printf("Received notification %d...\n", dwWaitStatus);
      if (::ReadDirectoryChangesW(hFile, lpBuffer, sizeof(lpBuffer), FALSE,
        FILE_NOTIFY_CHANGE_FILE_NAME,
        &dwBytes, &sOverlapped, NULL))
      {
        _stprintf(szDir, _T("C:\\test\\%s"), lpBuffer);
        printf("%s\n", lpBuffer);
      }
      else
      {
        DWORD dwError = GetLastError();
        printf("ReadDirectoryChangesW failed with error %d\n", dwError);
        return 1;
      }
      if (!ResetEvent(sOverlapped.hEvent))
      {
        printf("ResetEvent failed with error %d\n", GetLastError());
        return 1;
      }
    }
    else if (dwWaitStatus == (WAIT_OBJECT_0 + 1))
    {
      printf("Manual intervention occurred...\n");
      return 1;
    }
    else
    {
      printf("WaitForMultipleObjects failed with error %d\n", GetLastError());
      return 1;
    }
  }
  if (::CloseHandle(hFile) == FALSE)
  {
    printf("CloseHandle failed with error %d\n", GetLastError());
    return 1;
  }
  if (::CloseHandle(sOverlapped.hEvent) == FALSE)
  {
    printf("CloseHandle failed with error %d\n", GetLastError());
    return 1;
  }
  return 0;
}

以上就是如何利用C语言与VC++实现指定路径下文件的实时监控代码的示例,读者可以根据自己的需要进行调整和优化代码。

  
  

评论区