如何监视Windows目录的更改?

Windows系统的目录中进行更改时,需要立即通知程序进行更改。

发生更改时是否有执行程序的方法?

我不是一个C / C ++ / .NET程序员,所以如果我可以设置一些东西,以便更改可以触发一个batch file,那么这将是理想的。

使用下面的FileSystemWatcher来创建一个WatcherCreated事件()。 我使用这个来创建一个Windows服务,它观看一个网络文件夹,然后在新文件到达时通过电子邮件发送指定的组。

// Declare a new FILESYSTEMWATCHER protected FileSystemWatcher watcher; string pathToFolder = @"YourDesired Path Here"; // Initialize the New FILESYSTEMWATCHER watcher = new FileSystemWatcher {Path = pathToFolder, IncludeSubdirectories = true, Filter = "*.*"}; watcher.EnableRaisingEvents = true; watcher.Created += new FileSystemEventHandler(WatcherCreated); void WatcherCreated(object source , FileSystemEventArgs e) { //Code goes here for when a new file is detected } 

FileSystemWatcher是正确的答案,只不过它曾经是FileSystemWatcher一次只能用于“少数”更改。 这是因为操作系统缓冲区。 在实践中,每当复制很多小文件时,保存文件名称的缓冲区溢出。 这个缓冲区并不是正确的方法来跟踪最近的变化,因为操作系统将不得不停止写缓冲区已满,以防止超限。

Microsoft改为提供其他功能(编辑:如更改日志)以真正捕获所有更改。 这基本上是备份系统使用的设施,并且对记录的事件是复杂的。 而且也很少记录。

一个简单的测试就是生成大量的小文件,看它们是否都被FileSystemWatcher报告。 如果遇到问题,我建议避开整个问题,并按定时间隔扫描文件系统以进行更改。

如果你想要非程序化的东西尝试GiPo @ FileUtilities …但在这种情况下,这个问题不属于这里!

使用FileSystemWatcher

我在寻找监控文件系统活动的方式时出现在这个页面上。 我使用了Refracted Paladin的文章和他共享的FileSystemWatcher ,并写了一个快速而又脏的C#实现:

 using System; using System.IO; namespace Folderwatch { class Program { static void Main(string[] args) { //Based on http://stackoverflow.com/questions/760904/how-can-i-monitor-a-windows-directory-for-changes/27512511#27512511 //and http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx string pathToFolder = string.Empty; string filterPath = string.Empty; const string USAGE = "USAGE: Folderwatch.exe PATH FILTER \n\n eg:\n\n Folderwatch.exe c:\\windows *.dll"; try { pathToFolder = args[0]; } catch (Exception) { Console.WriteLine("Invalid path!"); Console.WriteLine(USAGE); return; } try { filterPath = args[1]; } catch (Exception) { Console.WriteLine("Invalid filter!"); Console.WriteLine(USAGE); return; } FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = pathToFolder; watcher.Filter = filterPath; watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; // Add event handlers. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; // Wait for the user to quit the program. Console.WriteLine("Monitoring File System Activity on {0}.", pathToFolder); Console.WriteLine("Press \'q\' to quit the sample."); while (Console.Read() != 'q') ; } // Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); } private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); } } } 

要使用这个,下载Visual Studio(快车会做)。 创建一个名为Folderwatch的新C#控制台应用程序,并将我的代码复制并粘贴到Program.cs中。

作为替代,你可以使用Sys Internals进程监视器: 进程监视器它可以监视文件系统和更多。

没有实用程序或与Windows自带的程序来做到这一点。 一些编程需要。

正如在另一个答案中指出的,.NET的FileSystemWatcher是最简单的方法。

本地API ReadDirectoryChangesW比较难使用(需要了解完成端口)。

这个问题帮助我了解了File Watcher System。 我实现了ReadDirectoryChangesW来监视目录及其所有子目录,并获取有关这些目录中的更改的信息。

我已经写了一篇关于这个的博客文章,我想分享一下,这样可能会帮助一个在这里降落同样的问题的人。

Win32 File Watcher Api来监视目录的变化 。