博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FileSystemWatcher 读取文件时出现被占用的解决方法
阅读量:5257 次
发布时间:2019-06-14

本文共 2773 字,大约阅读时间需要 9 分钟。

今天做一个小程序监控目录并序列化XML时遇到第一次正常,第二个新文件加入时出现文件被占用的错误,记录下解决方法。

1 FileSystemWatcher watcher = new FileSystemWatcher{ 2                 Path = path, 3                 Filter = filter, 4                 EnableRaisingEvents = true, 5                 IncludeSubdirectories = true, 6                 NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | 7                     NotifyFilters.FileName | NotifyFilters.LastAccess 8                     | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size 9             };10             watcher.Created += OnCreated;11 12 private static void OnCreated(object source, FileSystemEventArgs e)13         {14             Console.WriteLine("Got a new file " + e.Name);15 16                 #region === 读取文件内容 ===17                 string xmlStr = string.Empty;18                 while (true)19                 {20                     try21                     {22                         using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))23                         {24                             if (stream != null)25                                 break;26                         }27                         System.Threading.Thread.Sleep(500);28                     }29                     catch (Exception ex)30                     {31                         Console.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.Name, ex.Message));32                     }33                 }34 35                 using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))36                 {37                     using (StreamReader sr = new StreamReader(fs, Encoding.Default))38                     {39                         xmlStr = sr.ReadToEnd();40                     }41                 }42                 #endregion43         }

主要原因是文件还在写入过程中,还被占用,所以不能读取,以下代码为核心解决方法:

while (true)                 {                     try                     {                         using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))                         {                             if (stream != null)                                 break;                         }                         System.Threading.Thread.Sleep(500);                     }                     catch (Exception ex)                     {                         Console.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.Name, ex.Message));                     }                 }

 提示:如果是以windows 服务的形式访问网络文件时,不能通知映射盘符的方式,必须是以IP或者hostname方式,比如不能是Z:\\abc\,必须为\\192.168.1.2\abc\

转载于:https://www.cnblogs.com/TandyChan/p/4819672.html

你可能感兴趣的文章
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
socket初识
查看>>
磁盘测试工具
查看>>
代码变量、函数命名神奇网站
查看>>
redis cli命令
查看>>
Problem B: 占点游戏
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>