从另一个类调用的文件系统监视程序进程未触发事件c#

时间:2018-09-27 17:14:55

标签: c# events service filesystemwatcher

我有一个Windows服务,该服务基本上监视一个文件夹,将文件复制到本地目录以处理文件。该服务启动足够好,可以调用Watcher类,并按照应有的方式进行所有配置。因此,我的代码适用于设置。但是我有0事件触发。我想知道我的StartFolderWatcher()方法何时超出我的对象范围,即使在类级别声明了该对象也已被处置。

那么我是否需要在单独的线程中连续运行对象?如果可以的话,我可以举一个Task.Run(()=> myObject)

的示例。

下面是相关代码-如果需要更多,请询问,我将其发布。

        static class Program
        {
            static void Main(string[] args)
            {
                JobProcessor service = new JobProcessor();

                if (Environment.UserInteractive)
                {                 
                    service.RunAsConsole(args);
                }
           }

            private static bool IsDebugMode(string[] args)
            {
                if (args == null) return false;
                if (args[0].ToLower() == "/debug") return true;
                return false;
            }

    }

        public partial class JobProcessor : ServiceBase
        {
            string[] folders = new string[] {"InBoxFolder"};

            HotFolderWatch HFW = new HotFolderWatch();

            public JobProcessor()
            {
                InitializeComponent();

            }

            protected override void OnStart(string[] args)
            {

                StartFolderWatcher();
            }

            public void StartFolderWatcher()
            {
                FileWatcherInfo[] ServiceWatchers = new FileWatcherInfo[4];

                ServiceConfiguration sc = new ServiceConfiguration();

                for (int i = 0; i < folders.Length; i++)
                {
                    ServiceWatchers[i] = sc.GetWatchFolderSettings(folders[i]);
                }

                HFW = new HotFolderWatch(ServiceWatchers[0]);

                HFW.ReadyToProcess += ReadyToProcess;
                HFW.InBoxFolderDisconnected += OnInBoxFolderDisconnected;
                HFW.LocalFolderDisconnected += OnLocalFolderDisconnected;
                HFW.ProcessFolderDisconnected += OnProcessFolderDisconnected;

            }


            public void RunAsConsole(string[] args)
            {
              OnStart(args);
              Console.WriteLine("Press any key to exit...");
              Console.ReadLine();
              OnStop();
            }

         }


            public HotFolderWatch(FileWatcherInfo inbox)
            {


                this.InboxCacheTimeMilliseconds = inbox.CacheTimeMilliseconds;
                this.InBoxFolder = inbox.Folder.Trim();
                this.InboxFileFilter = inbox.Filter.Trim();
            SetInboxWatcher();

           }

            private void SetInboxWatcher()
            {
                InBoxWatcher = new FileSystemWatcher(InBoxFolder, InboxFileFilter);
                InBoxWatcher.IncludeSubdirectories = false;
                InBoxWatcher.NotifyFilter =
 NotifyFilters.LastAccess | NotifyFilters.LastWrite;

                InboxCache = MemoryCache.Default;
                InboxCachePolicy = new CacheItemPolicy()
                {
                    RemovedCallback = OnRemovedFromInBoxCache
                };

                InBoxWatcher.Created += new FileSystemEventHandler(OnInBoxChanged);
                InBoxWatcher.EnableRaisingEvents = true;
            }

            private void OnInBoxChanged(object source, FileSystemEventArgs e)
            {
                InboxCachePolicy.AbsoluteExpiration =

 DateTimeOffset.Now.AddMilliseconds(InboxCacheTimeMilliseconds);
                InboxCache.AddOrGetExisting(e.Name, e, InboxCachePolicy);
            }    
    }

如果在我的HotFolderWatch类中,我可以使用以下代码的方法创建FileSystemWatcher!

private void CreateWatcher()
{

    FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Tests\JobQueue\InFolder","*.txt");
    fsw.Created += Fsw_Created;
    fsw.EnableRaisingEvents = true;
}

private void Fsw_Created(object sender, FileSystemEventArgs e)
{
    string ex = e.FullPath;
    WatcherChangeTypes ctmp = e.ChangeType;
   // throw new NotImplementedException();
}

1 个答案:

答案 0 :(得分:1)

结果是FileSystemWatcher的默认构造函数默认情况下使用过滤器FileName,我想我会得到最后的Write或Last Access,而不必担心与Name有关。 我从这里收到了很好的信息: https://www.codeproject.com/Articles/1220094/NotifyFilters-Enumeration-Explained-FileSystemWatc

链接中发布的文章帮助我解决了问题。

我必须将NotifyFilters.FileName用作过滤器之一。