【问题标题】:ReadDirectoryChangesW doesn't do anything c++ReadDirectoryChangesW 不做任何事情 c++
【发布时间】:2011-09-15 20:26:25
【问题描述】:

我这样做对吗?

我正在尝试查找在名为 C:\Perl 的文件夹中发生的所有更改

在 ReadDirectoryChangesW 之后,它就卡在那里了。它没有前进。我错过了什么明显的东西吗?

我正在努力实现:How can I detect only deleted, changed, and created files on a volume?

每天一次,我想运行备份程序,它只会备份特定文件夹下更改的文件。

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szBuffer[640] = {0};  
DWORD dwOffset = 0;
FILE_NOTIFY_INFORMATION* pInfo = NULL;
DWORD dwBytes;
HANDLE hFolder = CreateFile(L"C:\\Perl", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
cout<<"Hello"<<endl;
ReadDirectoryChangesW(hFolder, szBuffer, sizeof(szBuffer) / sizeof(TCHAR), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &dwBytes, NULL, NULL);
cout<<"Done"<<endl;
do
{
    // Get a pointer to the first change record...
    pInfo = (FILE_NOTIFY_INFORMATION*) &szBuffer[dwOffset];

    // ReadDirectoryChangesW processes filenames in Unicode. We will convert them to a TCHAR format...
    TCHAR szFileName[MAX_PATH] = {0};

    wcout<<pInfo->FileName<<"\t"<<pInfo->Action ;
    //WideCharToMultiByte(CP_ACP, NULL, pInfo->FileName, pInfo->FileNameLength, szFileName, sizeof(szFileName) / sizeof(TCHAR), NULL, NULL);

    // Perform your tests here...
    if (pInfo->Action == FILE_ACTION_ADDED)
    {
    }

    // More than one change may happen at the same time. Load the next change and continue...
    dwOffset += pInfo->NextEntryOffset;
}
while (pInfo->NextEntryOffset != 0);

}

【问题讨论】:

  • 如果你想让它异步,你必须使用 OVERLAPPED。

标签: c++ windows backup


【解决方案1】:

您是在同步模式下调用它,因此在报告有更改之前它不会返回。这是设计使然。

documentation 中的备注部分解释了如何异步调用它。

听起来你想要看到 if 自某个时间点以来发生了什么变化。如果是这样,这不是您正在寻找的 API。您可以迭代内容并检查每个文件的创建和修改时间戳。如果您想注意删除,则必须跟踪上次发现的内容,并检查这次是否仍然存在。

【讨论】:

  • 是的,对于文件内容的更改,我只是检查存档位。我想避免这样做,因为访问每个文件并检查它是否被修改需要很长时间。大多数防病毒和备份应用程序都使用更改日志,其中记录了给定卷上发生的每个更改。你会碰巧知道任何替代方案吗?
  • ReadDirectoryChanges 简介有你想要的链接:msdn.microsoft.com/en-us/library/aa363798(v=vs.85).aspx
  • 如果您要监控的文件和目录的数量很大,例如整个卷,您可能希望使用 NTFS 更改日志。我更喜欢 Windows API,而不是手动扫描所有文件并检查时间戳和属性。
  • @Adrian - 我很困惑,在回答中你刚刚说 API 不是我想要的。但是,在 cmets 你说完全相同的 API 会做我想要的???你能说清楚一点吗?
  • @AJG85- 每次扫描 ReadDirectoryChanges 时,它会自动更新 USN 日志记录吗?并且只扫描自上次扫描以来的更改?
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多