[.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)
{
// 档案建立后要做的事
}
}
}
}
期許自己~
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。

浙公网安备 33010602011771号