FileSystemWatcher против опроса, чтобы наблюдать за изменениями файла - PullRequest
141 голосов
/ 27 октября 2008

Мне нужно настроить приложение, которое отслеживает файлы, создаваемые в каталоге, как локально, так и на сетевом диске.

Будет ли FileSystemWatcher или опрос по таймеру лучшим вариантом. Я использовал оба метода в прошлом, но не широко.

Какие проблемы (производительность, надежность и т. Д.) Возникают при использовании любого из этих методов?

Ответы [ 13 ]

2 голосов
/ 20 октября 2013

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

В настоящее время я пытаюсь решить, буду ли я использовать опрос FSW или для проекта, который я разрабатываю. Читая ответы, очевидно, что есть случаи, когда ЖСБ полностью удовлетворяет потребности, в то время как в других случаях вам необходимо опросить . К сожалению, нет ответа фактически имел дело с разницей в производительности (если есть), только с проблемами "надежности". Кто-нибудь может ответить на эту часть вопроса?

РЕДАКТИРОВАТЬ: пункт nmclean за правильность использования как ЖСБ, так и опросов (вы можете прочитать обсуждение в комментариях, если вам интересно) представляется весьма рациональным объяснением того, почему в ситуациях, когда использование FSW и опроса эффективно . Спасибо, что пролили свет на это для меня (и для всех, кто придерживается того же мнения), nmclean .

1 голос
/ 15 февраля 2016

Рабочее решение для работы с событием создания вместо изменения

Даже для копирования, вырезания, вставки, перемещения.

class Program
{        

        static void Main(string[] args)
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";
            FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
            FileSystemWatcher.Path = SourceFolderPath;
            FileSystemWatcher.IncludeSubdirectories = false;
            FileSystemWatcher.NotifyFilter = NotifyFilters.FileName;   // ON FILE NAME FILTER       
            FileSystemWatcher.Filter = "*.txt";         
             FileSystemWatcher.Created +=FileSystemWatcher_Created; // TRIGGERED ONLY FOR FILE GOT CREATED  BY COPY, CUT PASTE, MOVE  
            FileSystemWatcher.EnableRaisingEvents = true;

            Console.Read();
        }     

        static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {           
                string SourceFolderPath = "D:\\SourcePath";
                string DestinationFolderPath = "D:\\DestinationPath";

                try
                {
                    // DO SOMETING LIKE MOVE, COPY, ETC
                    File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
                }
                catch
                {
                }          
        }
}

Решение для этого средства просмотра файлов, когда событие изменения атрибута файла использует статическое хранилище

class Program
{
    static string IsSameFile = string.Empty;  // USE STATIC FOR TRACKING

    static void Main(string[] args)
    {
         string SourceFolderPath = "D:\\SourcePath";
        string DestinationFolderPath = "D:\\DestinationPath";
        FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
        FileSystemWatcher.Path = SourceFolderPath;
        FileSystemWatcher.IncludeSubdirectories = false;
        FileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;          
        FileSystemWatcher.Filter = "*.txt";         
        FileSystemWatcher.Changed += FileSystemWatcher_Changed;
        FileSystemWatcher.EnableRaisingEvents = true;

        Console.Read();
    }     

    static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (e.Name == IsSameFile)  //SKIPS ON MULTIPLE TRIGGERS
        {
            return;
        }
        else
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";

            try
            {
                // DO SOMETING LIKE MOVE, COPY, ETC
                File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
            }
            catch
            {
            }
        }
        IsSameFile = e.Name;
    }
}

Это обходное решение для этой проблемы многократного запуска события.

0 голосов
/ 03 июля 2014

Я бы сказал, использовать опрос, особенно в сценарии TDD, так как гораздо проще смоделировать / заглушить наличие файлов или иным образом при запуске события опроса, чем полагаться на более «неконтролируемое» событие fsw. + к тому, что он работал над несколькими приложениями, которые страдали от ошибок fsw.

...