當在Windows系統上的某個目錄中進行更改時,需要立即通知該程序發生更改。如何監視Windows目錄的更改?
發生更改時是否有某種方式執行程序?
我不是C/C++/.NET程序員,所以如果我可以設置一些東西,以便更改可以觸發批處理文件,那麼這將是理想的。
當在Windows系統上的某個目錄中進行更改時,需要立即通知該程序發生更改。如何監視Windows目錄的更改?
發生更改時是否有某種方式執行程序?
我不是C/C++/.NET程序員,所以如果我可以設置一些東西,以便更改可以觸發批處理文件,那麼這將是理想的。
使用類似下面的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
}
我需要Visual Studio?我可以在VBScript中使用它嗎? – Liam 2009-04-17 15:43:52
FileSystemWatcher是.Net所以是的這個解決方案將需要Visual Studio。 – 2009-04-17 15:47:18
如果你想要的東西非程序嘗試[email protected] ...但在這種情況下,問題將不屬於這裏!
的確,這個問題可能更適合超級用戶甚至服務器故障,但是這個答案直接回答了OP的問題:「有什麼方法在發生變化時執行程序?」。 – Pat 2012-07-17 17:04:37
GiPo @ FileUtilities似乎已被刪除,但如果您需要非程序化的東西,http://www.myassays.com/folder-poll會做類似的事情。 – 2016-09-05 10:23:42
沒有實用程序或與Windows自帶的程序來做到這一點。需要一些編程。
正如在另一個答案中指出的,.NET的FileSystemWatcher
是最簡單的方法。
本地API ReadDirectoryChangesW比較難使用(需要了解完成端口)。
FileSystemWatcher是正確的答案,只不過它曾經是FileSystemWatcher一次僅適用於「少數」更改。這是因爲操作系統緩衝區。在實踐中,每當複製很多小文件時,保存文件名稱變化的緩衝區就會被超載。這個緩衝區並不是真正的跟蹤最近變化的正確方法,因爲當緩衝區已滿時操作系統將不得不停止寫入以防止超限。
Microsoft改爲提供其他功能(編輯:如更改日誌)以真正捕獲所有更改。這基本上是備份系統使用的設施,並且對記錄的事件很複雜。並且也很少記錄。
一個簡單的測試是生成大量的小文件,並查看是否全部由FileSystemWatcher報告。如果您遇到問題,我建議避開整個問題並按定時間隔掃描文件系統以進行更改。
這個問題幫助我理解了File Watcher System。我實現了ReadDirectoryChangesW來監視目錄及其所有子目錄,並獲取有關這些目錄中更改的信息。
我寫過一篇關於同一篇文章的博客文章,我想分享一下,所以它可能會幫助有人在這裏出現同樣的問題。
我在尋找監控文件系統活動的方式時出現在這個頁面上。我拿了折射聖騎士的職位和他分享,寫了一個快速和骯髒的工作C#實現FileSystemWatcher:
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 e.g.:\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(Express將做)。創建一個名爲Folderwatch的新C#控制檯應用程序,並將我的代碼複製並粘貼到您的Program.cs中。
作爲替代方案,您可以使用Sys Internals Process Monitor:Process Monitor它可以監視文件系統和更多。
它可以通過VBScript和WMI完成,請參閱此實現http://www.go-geek.com/tips-n-tricks/monitor-directory-for-new-files-with-wsh.html – Pradeep 2012-08-07 13:57:31