在窗户,是有一个简单的方法来告诉我们,如果一个文件夹子文件具有改变吗?

我验证,并最后修改的日期上的文件夹没有得到更新,当一个子文件的变化。

是否有一个注册项目,我可以设置,将修改这一行为?

如果它的事项,我使用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;
      }
   }
}

其他提示

这也许是矫枉过正,但是 IFS kit 从MS或 FDDK 从系统可能是一个替代方案。创建你自己的文件系统的过滤器驱动器用的简单监测的所有变化的文件系统。

ReadDirectoryChangesW

一些优秀的样的代码中 这个演示文章

如果你不能运行过程中发生变化时,则没有多少你可以做到除了扫描文件系统,并检查修改的日期/时间。这需要你存储每个文件的最后日期/时间,不过,比较。

你可以加速这一通过使用 存档位 (虽然它可能搞砸了你的备用软件,以继续小心).

一个归档位是一个属性文件 存在于许多计算机文件的系统, 值得注意的是脂肪、FAT32和稳定。的 目的存档位追踪 增量变化文件 目的备份,也被称为 存档。

作为存档位是二进制位、它 是1或0,或在这种情况下的更多 经常调集(1)和清除 (0).操作系统设置的 存档位的任何时间文件 创建移动,重新命名,或者 以任何方式修改。存档位 因此代表一个两个 国家:"更改"和"不改变" 由于最后一个备份。

存档位不受影响 只需阅读一个文件。当一个文件 复制的原件文件归档 位不受影响,但是复制的 存档位将设在时间 复制成。

所以该过程将是:

  1. 明确的存档位在所有的文件
  2. 让文件系统,随时间的变化
  3. 扫描所有文件的任何有存档的位置有变化

这将消除需要你的程序,以保持状态,而且因为你只要过目录项(其中位存储),他们都聚集,它应该是非常,非常快。

如果你可以运行的一个过程期间,变化,但是,然后你会想看看的 更改 类。这里有一个 你怎么可能使用它。

它还存在 .净 (未来搜索这种类型的问题)

也许你可以离开一个进程运行的机器上看的变化和创造一个文件,为你以后阅读。

-亚当

也许你可以使用的NTFS5改变Journal与DeviceIoControl作为解释 在这里,

如果你们不反对使用。净的 更改 类将处理这个对你相当容易。

从双后有人提到:WMI事件沉

还在寻找一个更好的答案。

没有什么容易的-如果你有一个运行的应用程序可以使用Win32文件的更改通知api(FindFirstChangeNotification)的建议,与其他的答案。警告:大约在2000年的趋势微实时病毒扫描仪,将集团一起改变使得有必要使用非常大的缓冲区时,请求文件的系统更改的名单。

如果你没有一个运行的程序,你可以打开ntfs日志和扫描日志的变化 http://msdn.microsoft.com/en-us/library/aa363798(VS。85).aspx 但是,这可以慢于扫描整个目录时的变化是较大的比#文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top