zoukankan      html  css  js  c++  java
  • [.NET] : 如何监看档案建立完毕

    前言 :

    一般在监控文件夹或是档案异动,大多使用FileSystemWatcher类别
    但FileSystemWatcher在监控档案建立的事件时
    他发出的 Created事件的时间点,是在档案建立开始的当时,而不是档案建立完毕的时间点。
    如果直接使用的话,有时会造成建立档案的线程跟监控档案的线程互相冲突
    造成『由于另一个进程正在使用档案』的例外产生。

    改为本篇文章介绍的使用方法及可避免上述问题

    实作 :

    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.IO; 
     
    namespace ConsoleApplication1 
    { 
        public class SampleFolderWatcher 
        { 
            // Properties  
            private string _folderPath = null; 
     
            private FileSystemWatcher _watcher = null; 
     
            private List<string> _creatingFiles = new List<string>(); 
     
     
            // Construction 
            public SampleFolderWatcher(string folderPath) 
            { 
                Require#region Require 
     
                if (folderPath == null) throw new ArgumentNullException(); 
     
                #endregion 
     
                _folderPath = folderPath; 
     
                _watcher = new FileSystemWatcher(); 
                _watcher.Path = _folderPath; 
                _watcher.Created += new FileSystemEventHandler(FileSystemWatcher_Creating); 
                _watcher.Changed += new FileSystemEventHandler(FileSystemWatcher_Changed); 
                _watcher.EnableRaisingEvents = true; 
            } 
     
     
            // FileSystemWatcher Events 
            private void FileSystemWatcher_Creating(object sender, FileSystemEventArgs e) 
            { 
                if (File.Exists(e.FullPath) == true) 
                { 
                    if (_creatingFiles.Contains(e.FullPath) == true) 
                    { 
                        _creatingFiles.Remove(e.FullPath); 
                    } 
                    _creatingFiles.Add(e.FullPath); 
                } 
            } 
     
            private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e) 
            { 
                if (File.Exists(e.FullPath) == true) 
                { 
                    if (_creatingFiles.Contains(e.FullPath) == true) 
                    { 
                        try 
                        { 
                            FileStream stream = File.OpenWrite(e.FullPath); 
                            stream.Close(); 
     
                            _creatingFiles.Remove(e.FullPath); 
     
                            FileSystemWatcher_Created(sender, new FileSystemEventArgs(WatcherChangeTypes.Created, Path.GetDirectoryName(e.FullPath), Path.GetFileName(e.FullPath))); 
                        } 
                        catch 
                        { 
     
                        } 
                    } 
                } 
            } 
     
            private void FileSystemWatcher_Created(object sender, FileSystemEventArgs e) 
            { 
                if (File.Exists(e.FullPath) == true) 
                { 
                    // 档案建立后要做的事 
                } 
            } 
        } 
    }
  • 相关阅读:
    Electron踩坑记录
    TypeScript实现设计模式——生成器模式
    在express中使用ES7装饰器构建路由
    微信小程序下载文件(非图片),并校验扩展名。
    防抖与节流
    yarn
    spark
    docker php-fpm中安装GD库
    thinkphp6 多应用路由遇坑记
    CentOS 7 开启SSH远程登录
  • 原文地址:https://www.cnblogs.com/clark159/p/2205001.html
Copyright © 2011-2022 走看看