[英]how can you monitor multiple shared files in an application that uses FileSystemWatcher to monitor multiple folders
[英]Monitor multiple folders using FileSystemWatcher
在 C# 中使用 FileSystemWatcher 監視多個文件夾(而不是子目錄)的最佳方法是什么?
我認為 FSW 不支持監視多個文件夾,因此只需為要監視的每個文件夾實例化一個。 但是,您可以將事件處理程序指向相同的方法,最終應該像我想的那樣工作。
最簡單的方法是創建FileSystemWatcher對象的多個實例。
http://www.c-sharpcorner.com/UploadFile/mokhtarb2005/FSWatcherMB12052005063103AM/FSWatcherMB.aspx
您必須確保正確處理兩個文件夾之間的事件:
盡管一些常見的事件(例如復制或移動文件)並不直接對應於事件,但這些事件確實會導致引發事件。 復制文件時,系統會在文件復制到的目錄中引發 Created 事件,但不會在原始目錄中引發任何事件。 當您移動文件時,服務器會引發兩個事件:源目錄中的 Deleted 事件,然后是目標目錄中的 Created 事件。
例如,您創建 FileSystemWatcher 的兩個實例。 FileSystemWatcher1 設置為監視“C:\\My Documents”,FileSystemWatcher2 設置為監視“C:\\Your Documents”。 現在,如果您將文件從“我的文檔”復制到“您的文檔”中,FileSystemWatcher2 將引發 Created 事件,但 FileSystemWatcher1 不會引發任何事件。 與復制不同,移動文件或目錄會引發兩個事件。 在前面的示例中,如果您將文件從“我的文檔”移動到“您的文檔”,則 FileSystemWatcher2 將引發 Created 事件,FileSystemWatcher 將引發 Deleted 事件
開箱即用,FileSystemWatcher 僅支持監視單個父目錄。 要監視多個同級目錄,您需要創建多個 FileSystemWatcher 實例。
但是,您可以嘗試通過利用 FileSystemWatcher 包含子目錄的能力來欺騙這種行為。 您可以從您正在觀看的目錄中創建一個 NTFS 連接點(又名符號鏈接)作為子目錄。 Sysinternals 的 Mark Russinovich 有一個名為Junction的實用程序,可以簡化符號鏈接的創建和管理。
請注意,您只能創建指向本地計算機上目錄的符號鏈接。
雖然這是一個我決定回答的老問題,因為我在任何地方都找不到好的答案。
那么,目的是使用 FileSystemWatcher 監視多個文件夾(而不是子目錄)? 這是我的建議:
using System;
using System.IO;
using System.Security.Permissions;
using System.Collections.Generic;
namespace MultiWatcher
// ConsoleApplication, which monitors TXT-files in multiple folders.
// Inspired by:
// http://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs(v=vs.100).aspx
{
public class Watchers
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if (args.Length < 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe PATH [...] [PATH]";
return;
}
List<string> list = new List<string>();
for (int i = 1; i < args.Length; i++)
{
list.Add(args[i]);
}
foreach (string my_path in list)
{
Watch(my_path);
}
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
private static void Watch(string watch_folder)
{
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = watch_folder;
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// 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;
}
// 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);
}
}
}
您可以簡單地使用 FileSystemWatcher 的多個實例,每個目錄一個實例嗎?
您必須實例化FileSystemWatcher
對象的多個實例。 雖然您可以將事件綁定到相同的方法並使用發送者對象來確定哪個FileSystemWatcher
觸發了事件。
var fsw1 = new FileSystemWatcher();
var fsw2 = new FileSystemWatcher();
FileSystemEventHandler fsw_changed = delegate(object sender, FileSystemEventArgs e)
{
Console.WriteLine("{0} - {1}", (sender as FileSystemWatcher).Path, e.ChangeType);
};
fsw1.Changed += fsw_changed;
fsw2.Changed += fsw_changed;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.