zoukankan      html  css  js  c++  java
  • 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);
                    }
                }
            }
        }
    }

  • 相关阅读:
    linux常用命令---文件操作
    Django 框架中定时触发脚本
    jquery 中选择当前标签下众多相同子标签中的第n个
    Django + DRF + Elasticsearch 实现搜索功能
    django 使用celery 实现异步任务
    python 通过 pymysql模块 操作 mysql 数据库
    django 自定义中间件 middleware
    django 使用其自带的验证系统 进行用户名有效性验证 登录状态验证 登入操作 登出操作
    python脚本 读取excel格式文件 并进行处理的方法
    python 将json格式的数据写入csv格式的文件中
  • 原文地址:https://www.cnblogs.com/zeshao/p/9019925.html
Copyright © 2011-2022 走看看