Param From Mumbai Ответов: 1

C# filesystemwatcher прекращает запуск событий через некоторое время


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

Моя проблема заключается в том ,что когда я запускаю Filesystemwatcher, он работает нормально, но через некоторое время перестает работать, то есть перестает запускать создание, удаление и изменение события.

Кто-нибудь может мне помочь?

Заранее спасибо.

Вот мой код lstFolder это мой список множественных путей

я использую оконное приложение для просмотра файлов и использую службу окон для запуска этого оконного приложения.

this.listFileSystemWatcher = new List();

            // Loop the list to process each of the folder specifications found
            if (lstFolder.Count > 0)// check if path is available to watch else exit file watcher
            {
                foreach (CustomFolderSettings customFolder in lstFolder)
                {
                    DirectoryInfo dir = new DirectoryInfo(customFolder.FWPath);
                    // Checks whether the folder is enabled and
                    // also the directory is a valid location
                    if (dir.Exists)//customFolder.FolderEnabled && 
                    {
                        customFolder.AllowedFiles = customFolder.FWExtension;// setting extension to allowed filw extension to log .
                        foreach (var strExt in customFolder.FWExtension.Split(','))
                        {

                            // Creates a new instance of FileSystemWatcher
                            //FileSystemWatcher fileSWatch = new FileSystemWatcher();
                             this.fileSWatch = new FileSystemWatcher();
                            // Sets the filter
                            fileSWatch.Filter = strExt;// customFolder.FolderFilter;
                                                       // Sets the folder location
                            fileSWatch.Path = customFolder.FWPath;
                            fileSWatch.InternalBufferSize = 64000;
                            // Sets the action to be executed
                            StringBuilder actionToExecute = new StringBuilder(customFolder.ExecutableFile);
                            // List of arguments
                            StringBuilder actionArguments = new StringBuilder(customFolder.ExecutableArguments);
                            // Subscribe to notify filters
                            fileSWatch.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                            // Associate the events that will be triggered when a new file Created,Changed,Deleted,Renamed //
                            // is added to the monitored folder, using a lambda expression                   
                            fileSWatch.Created += (senderObj, fileSysArgs) => fileSWatch_Created(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles);
                            fileSWatch.Changed += (senderObj, fileSysArgs) => fileSWatch_Changed(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles);

                            fileSWatch.Deleted += (senderObj, fileSysArgs) => fileSWatch_Deleted(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles);
                            fileSWatch.Renamed += (senderObj, fileSysArgs) => fileSWatch_Renamed(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles);
                            fileSWatch.Error += (senderObj, fileSysArgs) => fileSWatch_Error(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles);


                            // will track changes in sub-folders as well
                            fileSWatch.IncludeSubdirectories = customFolder.FWSubFolders;
                            // Begin watching
                            fileSWatch.EnableRaisingEvents = true;


                            // Add the systemWatcher to the list
                            listFileSystemWatcher.Add(fileSWatch);
                            GC.KeepAlive(fileSWatch);
                            GC.KeepAlive(listFileSystemWatcher);
                        }

                    }
                }

            }
            else
            {
                Application.Exit();
            }


Что я уже пробовал:

пробовал использовать внутреннее буферное хранилище и GC.keepalive (), но проблемы остались прежними.

0x01AA

Из того, что я читал о GC.KeepAlive- это очень хитрая штука. GC.KeepAlive не запрещает GC удалять объект "навсегда".

Посмотрите, например, здесь:
Когда GC.KeepAlive этого не делает – блог Криса Лайона[^]

Я бы просто позаботился о том, чтобы сфера вашего listFileSystemWatcher припадки.

Gerry Schmitz

Сколько "наблюдателей" файлов вы создаете?

Вы следили за их потреблением памяти с течением времени?

Сколько наблюдателей за файлами-это "слишком много"?

О скольких "событиях" идет речь?

Вы когда-нибудь "избавлялись" от наблюдателя файлов?

Вы когда-нибудь "перезапускали" файловый наблюдатель?

Dirk Bahle

На днях я прочитал статью Бена и подумал, что его модель довольно интересна, поскольку я столкнулся с подобными проблемами. У меня не было времени попробовать это на себе но может быть здесь есть что то полезное:
https://www.codeproject.com/Articles/1220093/A-Robust-Solution-for-FileSystemWatcher-Firing-Eve

1 Ответов

Рейтинг:
0

#realJSOP

Я подозреваю, что ваш FileSystemWatcher (или код, который выполняется в событии FSW) создает исключение, и вы его не ловите.