• C# FileSystemWatcher 并发


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.IO;
    using System.Collections;

    namespace Demo
    {
        public class FileListen
        {
            private AutoResetEvent autoResetEvent;
            private string listenPath = @"D:项目资料随笔Demolisten";
            private Queue fileQueue = new Queue();
            private static object objLock = new object();
            private bool isWait = true;

            public FileListen(string listenPath)
            {
                this.listenPath = listenPath;
                Init();
            }

            private void Init()
            {
                FileSystemWatcher watcher = new FileSystemWatcher(listenPath);
                watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                watcher.Filter = "*.txt";
                watcher.EnableRaisingEvents = true;
                watcher.Created += new FileSystemEventHandler(MonitorFileCreate);

                autoResetEvent = new AutoResetEvent(false);

                Thread thread = new Thread(DoWork);
                thread.Start();

                Reload();
            }

            private void Reload()
            {
                DirectoryInfo dires = new DirectoryInfo(listenPath);
                FileInfo[] files = dires.GetFiles().OrderBy(c => c.CreationTime).ToArray();
                foreach (FileInfo file in files)
                {
                    if (!fileQueue.Contains(file.FullName))
                    {
                        fileQueue.Enqueue(file.FullName);
                        //休眠1秒
                        Thread.Sleep(1000);
                        autoResetEvent.Set();
                    }
                }
            }

            private void DoWork()
            {
                Console.WriteLine("DoWork Begin");
                //等待信号
                while (isWait)
                {
                    autoResetEvent.WaitOne();
                    //锁定 防止并发
                    lock (objLock)
                    {
                        //获取文件队列信息 并移除
                        string path = fileQueue.Dequeue().ToString();
                        Console.WriteLine("正在处理=>" + path);
                        Console.WriteLine("处理中...");
                        Console.WriteLine("处理完成");
                        File.Delete(path);
                    }
                }
            }

            private void MonitorFileCreate(object sender, FileSystemEventArgs e)
            {
                if (e.ChangeType == WatcherChangeTypes.Created)
                {
                    try
                    {
                        if (!fileQueue.Contains(e.FullPath))
                        {
                            Console.WriteLine("监听文件=>" + e.FullPath);

                            Thread.Sleep(500);
                            fileQueue.Enqueue(e.FullPath);
                            autoResetEvent.Set();
                        }
                    }
                    catch (Exception ex)
                    {
                        //LogHelper.Error(ex.Message + " " + ex.StackTrace);
                    }
                }
            }
        }
    }

  • 相关阅读:
    一个好用的web甘特图
    应用ExcelPackage导出Excel
    Base64中文不能加密问题
    Sql Server存储过程和函数浅谈
    .NET反编译之Reflector基础示例
    NPOI导出数据到Excel
    twitter接口开发
    Nginx基本属性配置详解
    ssh-keygen创建证书
    asp.net core 设置默认文档index.html
  • 原文地址:https://www.cnblogs.com/zeshao/p/9019925.html
Copyright © 2020-2023  润新知