今天做一個小程序監控目錄並序列化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 try 21 { 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 #endregion 43 }
主要原因是文件還在寫入過程中,還被占用,所以不能讀取,以下代碼為核心解決方法:
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\
