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) 
                { 
                    // 档案建立后要做的事 
                } 
            } 
        } 
    }
  • 相关阅读:
    Vue.nextTick()的介绍和使用场景
    JS实现数据双向绑定
    JS对象的可枚举属性和不可枚举属性
    JS中对象转数组方法总结
    Vmware虚拟机安装XP系统
    javascript和c#的深度拷贝的一种通用方法
    c# SQLServer导入大批量数据
    PowerDesigner逆向工程,从SQL Server数据库生成Physical Model -----数据源方式
    虚拟机和主机ping不通,SQL Server无法远程连接的解决方法
    c#生成试卷。。。
  • 原文地址:https://www.cnblogs.com/clark159/p/2205001.html
Copyright © 2011-2022 走看看