簡體   English   中英

使用 FileSystemWatcher 監控多個文件夾

[英]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 事件

鏈接到FileSystemEventArgs

開箱即用,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM