web-dev-qa-db-ja.com

FileSystemWatcherを使用して複数のフォルダーを監視する

C#でFileSystemWatcherを使用して(サブディレクトリではなく)複数のフォルダーを監視する最良の方法は何ですか?

22
Bi.

FSWが複数のフォルダの監視をサポートしているとは思わないので、監視するフォルダごとに1つだけインスタンス化してください。ただし、同じ方法でイベントハンドラーを指定することもできます。

20
Factor Mystic

最も簡単な方法は、 FileSystemWatcher オブジェクトの複数のインスタンスを作成することです。

http://www.c-sharpcorner.com/UploadFile/mokhtarb2005/FSWatcherMB12052005063103AM/FSWatcherMB.aspx

2つのフォルダー間のイベントを正しく処理することを確認する必要があります。

ファイルのコピーや移動などの一般的な発生はイベントに直接対応していませんが、これらの発生はイベントを発生させます。ファイルをコピーすると、ファイルがコピーされたディレクトリでCreatedイベントが発生しますが、元のディレクトリではイベントは発生しません。ファイルを移動すると、サーバーは2つのイベントを発生させます。1つはソースディレクトリのDeletedイベント、もう1つはターゲットディレクトリのCreatedイベントです。

たとえば、FileSystemWatcherの2つのインスタンスを作成します。 FileSystemWatcher1は "C:\ My Documents"を監視するように設定され、FileSystemWatcher2は "C:\ Your Documents"を監視するように設定されています。ここで、「マイドキュメント」から「あなたのドキュメント」にファイルをコピーすると、FileSystemWatcher2によってCreatedイベントが発生しますが、FileSystemWatcher1のイベントは発生しません。コピーとは異なり、ファイルまたはディレクトリを移動すると、2つのイベントが発生します。前の例から、ファイルを「My Documents」から「Your Documents」に移動した場合、CreatedイベントはFileSystemWatcher2によって発生し、DeletedイベントはFileSystemWatcherによって発生します。

リンク先 FileSystemEventArgs

13
kemiller2002

デフォルトでは、FileSystemWatcherは単一の親ディレクトリの監視のみをサポートしています。複数の兄弟ディレクトリを監視するには、FileSystemWatcherの複数のインスタンスを作成する必要があります。

ただし、FileSystemWatcherのサブディレクトリを含める機能を利用して、この動作をだますことができます。監視しているディレクトリのサブディレクトリとしてNTFSジャンクションポイント(別名シンボリックリンク)を作成できます。 Sysinternalsの名声のMark Russinovichには、シンボリックリンクの作成と管理を簡素化するための Junction というユーティリティがあります。

ローカルマシン上のディレクトリへのシンボリックリンクしか作成できないことに注意してください。

3
Tim Trout

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;
2
BAH

これは古い質問ですが、どこにも良い答えが見つからなかったので、答えようと決めました。

それで、目的は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);
        }
    }
}
2
Ciove

ディレクトリごとに1つずつ、FileSystemWatcherの複数のインスタンスを使用できますか?

1
Charlie Salts

または、パスをコードで渡して、次のように監視されるドメインの特定の範囲をマークできます。

マルチモニターリンク

お役に立てれば。

0
Paradigm