今天做一个小程序监控目录并序列化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\