现在的位置: 首页 > 综合 > 正文

[.NET] : 如何监看档案建立完毕

2012年02月13日 ⁄ 综合 ⁄ 共 1640字 ⁄ 字号 评论关闭

 

前言 :

一般在监控文件夹或是档案异动,大多使用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) 
            { 
                // 档案建立后要做的事 
            } 
        } 
    } 
}
【上篇】
【下篇】

抱歉!评论已关闭.