21xrx.com
2024-09-20 06:11:32 Friday
登录
文章检索 我的文章 写文章
如何在C++中获取USN文件路径
2023-06-29 01:23:24 深夜i     --     --
C++ USN 文件路径

USN是Windows文件系统中的一个功能,用于记录文件修改事件。它允许应用程序跟踪文件的增量修改,并快速提取它们。在C++中,获取USN文件路径可以使用Win32 API函数来实现。以下是一些用于获取USN文件路径的方法:

1. 使用DeviceIoControl()

使用DeviceIoControl函数可以通过访问输入/输出(I/O)控制码实现获取USN文件路径。在调用函数时需要使用USN_JOURNAL_DATA结构体,它包含了访问USN日志的参数和信息。使用DeviceIoControl函数的示例代码:

HANDLE hVol = CreateFile("\\\\.\\D:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hVol != INVALID_HANDLE_VALUE){

  DWORD cb;

  USN_JOURNAL_DATA ujd;

  if (DeviceIoControl(hVol, FSCTL_QUERY_USN_JOURNAL,NULL, 0,&ujd,sizeof(ujd),&cb, NULL))

  然后遍历UID生成的描述符

  CloseHandle(hVol);

}

2. 使用FindFirstChangeNotification()

FindFirstChangeNotification函数用于创建一个用于监视文件或目录树变化的句柄。可以通过获取句柄并调用ReadDirectoryChangesW函数,来获取USN文件路径。使用FindFirstChangeNotification函数的示例代码:

HANDLE hChangeNotification = FindFirstChangeNotification("C:\\", FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);

if (hChangeNotification == INVALID_HANDLE_VALUE)

  return __errno();

while (WAIT_OBJECT_0 == WaitForSingleObject(hChangeNotification, INFINITE))

{

  callback(WaitForSingleObject);

  ResetEvent(hChangeNotification);

}

FindCloseChangeNotification(hChangeNotification);

3. 使用GetFileInformationByHandleEx()

GetFileInformationByHandleEx函数可以获取在句柄上关联的文件或目录的详细信息。它还可以使用FILE_ID_INFO结构体和FILE_DISPOSITION_INFO结构体,来获取USN文件路径。使用GetFileInformationByHandleEx函数的示例代码:

HANDLE hFile = CreateFile("c:\\test.txt", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)

  return __errno();

LPVOID pBuffer = NULL;

DWORD nBufferLength = sizeof(FILE_ID_INFO);

pBuffer = malloc(nBufferLength);

if (pBuffer == NULL)

  return E_OUTOFMEMORY;

if (GetFileInformationByHandleEx(hFile, FileIdInfo, pBuffer, nBufferLength))

{

  LPFILE_ID_INFO pfi = (LPFILE_ID_INFO)pBuffer;

  if (GetFileInformationByHandleEx(hFile, FileDispositionInfo, pBuffer, nBufferLength))

  {

    LPFILE_DISPOSITION_INFO pdi = (LPFILE_DISPOSITION_INFO)pBuffer;

    //处理获取到的路径

  }

}

CloseHandle(hFile);

综上所述,使用以上三种方式可以在C++中获取USN文件路径。具体使用哪种方式取决于应用场景和个人习惯。在使用时需要注意参数设置以及函数返回值的处理,以确保程序的正确性和稳定性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复