Подтвердить что ты не робот

Мониторинг нескольких папок с помощью FileSystemWatcher

Каков наилучший способ контролировать несколько папок (не подкаталогов) с помощью FileSystemWatcher в С#?

4b9b3361

Ответ 1

Я не думаю, что FSW поддерживает мониторинг нескольких папок, поэтому просто создайте экземпляр для каждой папки, которую вы хотите контролировать. Однако вы можете указать обработчики событий теми же методами, которые должны работать, как я думаю, вы хотите.

Ответ 2

Самый простой способ - создать несколько экземпляров объекта FileSystemWatcher.

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

Вам нужно убедиться, что вы правильно обрабатываете события между двумя папками:

Хотя некоторые общие случаи, такие как копирование или перемещение файла, не соответствуют непосредственно событию, эти происшествия действительно вызывают события поднял. Когда вы копируете файл, система создает a Созданное событие в каталог, в который был скопирован файл но не вызывает никаких событий в исходный каталог. Когда вы перемещаете файла, сервер вызывает два события: a Удаленное событие в исходном каталоге, за которым следует событие "Создано" в целевой каталог.

Например, вы создаете два экземпляра файла FileSystemWatcher. FileSystemWatcher1 настроен на просмотр "C:\Мои документы" и FileSystemWatcher2 настроен на просмотр "C:\Ваши документы". Теперь, если вы скопируете файл из "Мои документы" в "Ваш Документы", а созданное событие будет поднят FileSystemWatcher2, но нет событие поднято для FileSystemWatcher1. В отличие от копирования, перемещение файла или каталога приведет к два события. Из предыдущего примера, если вы переместили файл из раздела "Мой Документы" на "Ваши документы", Созданное событие будет FileSystemWatcher2 и удаленное событие будет поднят с помощью FileSystemWatcher

Ссылка на FileSystemEventArgs

Ответ 3

Из командной строки FileSystemWatcher поддерживает только один родительский каталог. Чтобы отслеживать несколько каталогов собора, вам нужно создать несколько экземпляров FileSystemWatcher.

Однако вы можете попробовать обмануть это поведение, используя способность FileSystemWatcher включать подкаталоги. Вы можете создать точку соединения NTFS (aka символическую ссылку) в качестве подкаталога из каталога, который вы смотрите. У Марка Руссиновича славы Sysinternals есть утилита Junction, чтобы упростить создание и управление символическими ссылками.

Обратите внимание, что вы можете создавать символические ссылки только на каталоги на локальном компьютере.

Ответ 4

Хотя это старый вопрос, я решил ответить, потому что я не мог найти хороший ответ нигде.

Итак, целью было контролировать несколько папок (не подкаталогов) с помощью 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);
        }
    }
}

Ответ 5

Вам нужно будет создать несколько экземпляров объекта 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;

Ответ 6

Можете ли вы просто использовать несколько экземпляров FileSystemWatcher, по одному для каждого каталога?

Ответ 7

или вы можете передать контуры внутри кода, чтобы отметить определенный диапазон домена, наблюдаемого как в этом:

ссылка на несколько мониторов

надеюсь, что это поможет.