場景:cs系統下產生的日志文件在登陸后需要在系統中讀取例如錯誤日志並顯示到系統中。
錯誤方式:
/// <summary> /// 根據導航地址加載內容 /// </summary> /// <param name="uri"></param> /// <returns></returns> protected override object LoadContent(Uri uri) { var sb = new StringBuilder(); var logPath = string.Format(@"{0}\{1}", _root, uri.ToString()); using (var fileStream = new FileStream(logPath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true)) { using (var streamReader = new StreamReader(fileStream, System.Text.Encoding.Default)) { while (streamReader.EndOfStream == false) { sb.AppendLine(streamReader.ReadLine()); } } return sb.ToString(); } }
錯誤原因:只讀方式打開文件,因為其他文件可能正在往里寫數據,所以要開啟共享鎖,如 FileShare.ReadWrite
正確:
/// <summary> /// 根據導航地址加載內容 /// </summary> /// <param name="uri"></param> /// <returns></returns> protected override object LoadContent(Uri uri) { var sb = new StringBuilder(); var logPath = string.Format(@"{0}\{1}", _root, uri.ToString()); using (var fileStream = new FileStream(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, bufferSize: 4096, useAsync: true)) { using (var streamReader = new StreamReader(fileStream, System.Text.Encoding.Default)) { while (streamReader.EndOfStream==false) { sb.AppendLine(streamReader.ReadLine()); } } return sb.ToString(); } }