最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++實現(xiàn)監(jiān)控目錄文件變化

 更新時間:2023年11月20日 11:25:43   作者:微軟技術(shù)分享  
ReadDirectoryChangesW是Windows操作系統(tǒng)提供的一個函數(shù),用于監(jiān)視目錄的變化,本文主要為大家介紹了如何使用ReadDirectoryChangesW實現(xiàn)監(jiān)控目錄文件變化,需要的可以參考下

監(jiān)視對指定目錄的更改,并將有關(guān)更改的信息打印到控制臺,該功能的實現(xiàn)不僅可以在內(nèi)核層,在應(yīng)用層同樣可以。程序中使用ReadDirectoryChangesW函數(shù)來監(jiān)視目錄中的更改,并使用FILE_NOTIFY_INFORMATION結(jié)構(gòu)來獲取有關(guān)更改的信息。

ReadDirectoryChangesW 是Windows操作系統(tǒng)提供的一個函數(shù),用于監(jiān)視目錄的變化。它屬于Windows API的一部分,主要用于監(jiān)視文件系統(tǒng)中目錄的修改、新增、刪除等變化,并通過回調(diào)函數(shù)向應(yīng)用程序提供通知。

以下是該函數(shù)的聲明:

BOOL ReadDirectoryChangesW(
  HANDLE                hDirectory,
  LPVOID                lpBuffer,
  DWORD                 nBufferLength,
  BOOL                  bWatchSubtree,
  DWORD                 dwNotifyFilter,
  LPDWORD               lpBytesReturned,
  LPOVERLAPPED          lpOverlapped,
  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

其中:

  • hDirectory:要監(jiān)視的目錄的句柄。
  • lpBuffer:接收變更通知的緩沖區(qū)。
  • nBufferLength:緩沖區(qū)的大小。
  • bWatchSubtree:如果為 TRUE,則監(jiān)視目錄樹中的所有目錄。如果為 FALSE,則僅監(jiān)視指定的目錄。
  • dwNotifyFilter:指定要監(jiān)視的變更類型,可以是文件夾或文件的新增、刪除、修改等。
  • lpBytesReturned:返回實際讀取到的字節(jié)數(shù)。
  • lpOverlapped:用于異步操作的 OVERLAPPED 結(jié)構(gòu)。
  • lpCompletionRoutine:指定一個回調(diào)函數(shù),在異步操作完成時調(diào)用。

在使用這個函數(shù)時,通常會在回調(diào)函數(shù)中處理具體的文件變更信息。ReadDirectoryChangesW通常用于異步操作,因此在調(diào)用時需要提供一個OVERLAPPED結(jié)構(gòu)或使用同步的方式等待變更。

如下代碼中使用CreateThread函數(shù)創(chuàng)建一個線程,并將MonitorFileThreadProc運行起來,此函數(shù)使用帶有FILE_LIST_directory標志的CreateFile打開指定的目錄,該標志允許該函數(shù)監(jiān)視目錄。并使用ReadDirectoryChangesW函數(shù)讀取目錄中的更改,傳遞一個緩沖區(qū)來存儲更改,并指定要監(jiān)視的更改類型。

使用WideCharToMultiByte函數(shù)將寬字符文件名轉(zhuǎn)換為多字節(jié)文件名,并將文件名與目錄路徑連接以獲得文件的完整路徑。然后,該功能將有關(guān)更改的信息打印到控制臺。

#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>

DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)
{
  char *pszDirectory = (char *)lParam;
  BOOL bRet = FALSE;
  BYTE Buffer[1024] = { 0 };

  FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;
  DWORD dwByteReturn = 0;
  HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
  if (INVALID_HANDLE_VALUE == hFile)
    return 1;

  while (TRUE)
  {
    ZeroMemory(Buffer, sizeof(Buffer));
    // 設(shè)置監(jiān)控目錄回調(diào)函數(shù)
    bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,
      FILE_NOTIFY_CHANGE_FILE_NAME |      // 修改文件名
      FILE_NOTIFY_CHANGE_ATTRIBUTES |     // 修改文件屬性
      FILE_NOTIFY_CHANGE_LAST_WRITE,      // 最后一次寫入
      &dwByteReturn, NULL, NULL);
    if (TRUE == bRet)
    {
      char szFileName[MAX_PATH] = { 0 };

      // 將寬字符轉(zhuǎn)換成窄字符,寬字節(jié)字符串轉(zhuǎn)多字節(jié)字符串
      WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,(pBuffer->FileNameLength / 2),
        szFileName,MAX_PATH,NULL,NULL);

      // 將路徑與文件連接成完整文件路徑
      char FullFilePath[1024] = { 0 };
      strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));
      strcat(FullFilePath, szFileName);

      switch (pBuffer->Action)
      {
        case FILE_ACTION_ADDED:
        {
          printf("添加: %s \n", FullFilePath); break;
        }
        case FILE_ACTION_REMOVED:
        {
          printf("刪除: %s \n", FullFilePath); break;
        }
        case FILE_ACTION_MODIFIED:
        {
          printf("修改: %s \n", FullFilePath); break;
        }
        case FILE_ACTION_RENAMED_OLD_NAME:
        {
          printf("重命名: %s", szFileName);
          if (0 != pBuffer->NextEntryOffset)
          {
            FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)
              ((DWORD)pBuffer + pBuffer->NextEntryOffset);
            switch (tmpBuffer->Action)
              {
                case FILE_ACTION_RENAMED_NEW_NAME:
                {
                  ZeroMemory(szFileName, MAX_PATH);
                  WideCharToMultiByte(CP_ACP,0,tmpBuffer->FileName,
                    (tmpBuffer->FileNameLength / 2),
                    szFileName,MAX_PATH,NULL,NULL);
                  printf(" -> %s \n", szFileName);
                  break;
                }
              }
          }
          break;
        }
        case FILE_ACTION_RENAMED_NEW_NAME:
        {
          printf("重命名(new): %s \n", FullFilePath); break;
        }
      }
    }
  }
  CloseHandle(hFile);
  return 0;
}

int main(int argc, char * argv[])
{
  char *pszDirectory = "C:\\";

  HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);
  WaitForSingleObject(hThread, INFINITE);
  CloseHandle(hThread);
  return 0;
}

運行后監(jiān)控C盤所有文件的變化,并輸出如下信息;

到此這篇關(guān)于C/C++實現(xiàn)監(jiān)控目錄文件變化的文章就介紹到這了,更多相關(guān)C++監(jiān)控目錄文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)簡單掃雷源碼

    C語言實現(xiàn)簡單掃雷源碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單掃雷源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C語言字母轉(zhuǎn)換大小寫的3種方法圖文詳解

    C語言字母轉(zhuǎn)換大小寫的3種方法圖文詳解

    我們在C語言入門的時候都會遇到要求寫大小寫轉(zhuǎn)換的題目,所以下面這篇文章主要給大家介紹了關(guān)于C語言字母轉(zhuǎn)換大小寫的3種方法,文中給了詳細的代碼示例,需要的朋友可以參考下
    2023-10-10
  • 嵌入式項目使用C語言結(jié)構(gòu)體位段特性實現(xiàn)斷言宏校驗數(shù)據(jù)范圍有效性的方法

    嵌入式項目使用C語言結(jié)構(gòu)體位段特性實現(xiàn)斷言宏校驗數(shù)據(jù)范圍有效性的方法

    今天小編就為大家分享一篇關(guān)于嵌入式項目使用C語言結(jié)構(gòu)體位段特性實現(xiàn)斷言宏校驗數(shù)據(jù)范圍有效性的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 詳解C++循環(huán)創(chuàng)建多級目錄及判斷目錄是否存在的方法

    詳解C++循環(huán)創(chuàng)建多級目錄及判斷目錄是否存在的方法

    這篇文章主要介紹了C++循環(huán)創(chuàng)建多級目錄及判斷目錄是否存在的方法,文中代碼有一個針對各種系統(tǒng)進行判斷來加載不同頭文件的方法,需要的朋友可以參考下
    2016-03-03
  • Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解

    Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置教程詳解

    這篇文章主要介紹了Win10下最新版CLion(2020.1.3)安裝及環(huán)境配置,CLion 是 JetBrains 推出的全新的 C/C++ 跨平臺集成開發(fā)環(huán)境,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2020-08-08
  • C語言實現(xiàn)的PNPoly算法代碼例子

    C語言實現(xiàn)的PNPoly算法代碼例子

    這篇文章主要介紹了C語言實現(xiàn)的PNPoly算法代碼例子,PNPoly算法j是判斷一個坐標點是否在不規(guī)則多邊形內(nèi)部的算法,需要的朋友可以參考下
    2014-07-07
  • C/C++讀取大文件數(shù)據(jù)方式詳細講解

    C/C++讀取大文件數(shù)據(jù)方式詳細講解

    這篇文章主要介紹了C語言/C++讀取大文件數(shù)據(jù)的完整方式過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-09-09
  • 嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    這是一年前我為公司內(nèi)部寫的一個文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機環(huán)境下編寫優(yōu)質(zhì)嵌入式C程序。感覺是有一定的參考價值,所以拿出來分享,拋磚引玉
    2022-04-04
  • C++ Boost Lockfree超詳細講解使用方法

    C++ Boost Lockfree超詳細講解使用方法

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++中的取余函數(shù)remainder與fmod詳解

    C++中的取余函數(shù)remainder與fmod詳解

    這篇文章主要為大家詳細介紹了C++中的取余函數(shù)remainder、fmod的具體使用以及自編的remainder及fmod,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習學(xué)習
    2023-05-05

最新評論

泽普县| 图片| 二手房| 马公市| 江西省| 大兴区| 平乡县| 嘉鱼县| 延长县| 阿拉善盟| 江孜县| 舟山市| 西林县| 宁海县| 连江县| 龙南县| 介休市| 伊春市| 民权县| 深圳市| 永安市| 绍兴县| 牙克石市| 浮山县| 木里| 大石桥市| 宣汉县| 河西区| 平顶山市| 梁山县| 石楼县| 古蔺县| 宁波市| 探索| 分宜县| 军事| 日喀则市| 平江县| 林芝县| 崇文区| 庆元县|