怎么看如果一个子文件的目录已经改变了
-
09-06-2019 - |
题
在窗户,是有一个简单的方法来告诉我们,如果一个文件夹子文件具有改变吗?
我验证,并最后修改的日期上的文件夹没有得到更新,当一个子文件的变化。
是否有一个注册项目,我可以设置,将修改这一行为?
如果它的事项,我使用windows nt量。
我最终会像为具有这种能力从C++的程序。
扫描整个目录递归不会为我工作,因为该文件夹的太大。
更新:我真的需要一种方法来这样做,没有一个运行的过程而发生变化。所以安装一个文件系统的看守不是最适合我。
Update2:存档位会也不起作用,因为它具有相同的问题作最后修改的日期。文件的存档位会被设定,但该文件夹不会。
解决方案
此 文章 应该有所帮助。基本上,你创建的一个或多个通知的对象,例如:
HANDLE dwChangeHandles[2]; dwChangeHandles[0] = FindFirstChangeNotification( lpDir, // directory to watch FALSE, // do not watch subtree FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); } // Watch the subtree for directory creation and deletion. dwChangeHandles[1] = FindFirstChangeNotification( lpDrive, // directory to watch TRUE, // watch the subtree FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir name changes if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); }
然后你等待一个通知:
while (TRUE) { // Wait for notification. printf("\nWaiting for notification...\n"); DWORD dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE); switch (dwWaitStatus) { case WAIT_OBJECT_0: // A file was created, renamed, or deleted in the directory. // Restart the notification. if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break; case WAIT_OBJECT_0 + 1: // Restart the notification. if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break; case WAIT_TIMEOUT: // A time-out occurred. This would happen if some value other // than INFINITE is used in the Wait call and no changes occur. // In a single-threaded environment, you might not want an // INFINITE wait. printf("\nNo changes in the time-out period.\n"); break; default: printf("\n ERROR: Unhandled dwWaitStatus.\n"); ExitProcess(GetLastError()); break; } } }
其他提示
一些优秀的样的代码中 这个演示文章
如果你不能运行过程中发生变化时,则没有多少你可以做到除了扫描文件系统,并检查修改的日期/时间。这需要你存储每个文件的最后日期/时间,不过,比较。
你可以加速这一通过使用 存档位 (虽然它可能搞砸了你的备用软件,以继续小心).
一个归档位是一个属性文件 存在于许多计算机文件的系统, 值得注意的是脂肪、FAT32和稳定。的 目的存档位追踪 增量变化文件 目的备份,也被称为 存档。
作为存档位是二进制位、它 是1或0,或在这种情况下的更多 经常调集(1)和清除 (0).操作系统设置的 存档位的任何时间文件 创建移动,重新命名,或者 以任何方式修改。存档位 因此代表一个两个 国家:"更改"和"不改变" 由于最后一个备份。
存档位不受影响 只需阅读一个文件。当一个文件 复制的原件文件归档 位不受影响,但是复制的 存档位将设在时间 复制成。
所以该过程将是:
- 明确的存档位在所有的文件
- 让文件系统,随时间的变化
- 扫描所有文件的任何有存档的位置有变化
这将消除需要你的程序,以保持状态,而且因为你只要过目录项(其中位存储),他们都聚集,它应该是非常,非常快。
如果你可以运行的一个过程期间,变化,但是,然后你会想看看的 更改 类。这里有一个 例 你怎么可能使用它。
它还存在 .净 (未来搜索这种类型的问题)
也许你可以离开一个进程运行的机器上看的变化和创造一个文件,为你以后阅读。
-亚当
也许你可以使用的NTFS5改变Journal与DeviceIoControl作为解释 在这里,
如果你们不反对使用。净的 更改 类将处理这个对你相当容易。
从双后有人提到:WMI事件沉
还在寻找一个更好的答案。
没有什么容易的-如果你有一个运行的应用程序可以使用Win32文件的更改通知api(FindFirstChangeNotification)的建议,与其他的答案。警告:大约在2000年的趋势微实时病毒扫描仪,将集团一起改变使得有必要使用非常大的缓冲区时,请求文件的系统更改的名单。
如果你没有一个运行的程序,你可以打开ntfs日志和扫描日志的变化 http://msdn.microsoft.com/en-us/library/aa363798(VS。85).aspx 但是,这可以慢于扫描整个目录时的变化是较大的比#文件。