System.IO.FileSystemWatcher与文件的打开状态
使用System.IO.FileSystemWatcher时,通常会想在检测到文件创建之后,扫描文件的内容,对之进行一定的处理。但是当我们的程序接到通知时,创建文件的进程可能还在写数据,这时如果想要打开这个文件会抛出异常。
似乎没有什么好办法来解决这个问题,除了最笨的一种:
似乎没有什么好办法来解决这个问题,除了最笨的一种:
FileSystemWatcher watcher = new FileSystemWatcher(directory, "*.txt");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Created += FileCreated;
watcher.EnableRaisingEvents = true;
private void FileCreated(object sender, FileSystemEventArgs e)
{
while (!IsFileReady(e.FullPath))
{
if (!File.Exists(e.FullPath))
return;
Thread.Sleep(100);
}
//在这里进行文件处理。。。
}
bool IsFileReady(string filename)
{
FileInfo fi = new FileInfo(filename);
FileStream fs=null;
try
{
fs = fi.Open(FileMode.Open, FileAccess.ReadWrite,
FileShare.None);
return true;
}
catch(IOException)
{
return false;
}
finally
{
if(fs!=null)
fs.Close();
}
}
好在这个事件不是在主线程引发,所以线程等个几秒钟也不是太大的问题。watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Created += FileCreated;
watcher.EnableRaisingEvents = true;
private void FileCreated(object sender, FileSystemEventArgs e)
{
while (!IsFileReady(e.FullPath))
{
if (!File.Exists(e.FullPath))
return;
Thread.Sleep(100);
}
//在这里进行文件处理。。。
}
bool IsFileReady(string filename)
{
FileInfo fi = new FileInfo(filename);
FileStream fs=null;
try
{
fs = fi.Open(FileMode.Open, FileAccess.ReadWrite,
FileShare.None);
return true;
}
catch(IOException)
{
return false;
}
finally
{
if(fs!=null)
fs.Close();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~