天天看點

c# 讀寫檔案時檔案正由另一程序使用,是以該程序無法通路該檔案,在IO處理上遇到了無法操作的問題

問題場景:process1.exe向目錄c:\syslog寫入檔案,檔案格式${unixtimestamp}.txt

process2.exe從c:\syslog讀取檔案

讀取的頻率比較高,大概毫秒級别100-500ms

一開始的思路

c# 讀寫檔案時檔案正由另一程式使用,是以該程式無法通路該檔案,在IO處理上遇到了無法操作的問題

初始代碼:

using (var reader = new StreamReader(fileinfo.FullName, Encoding.Default)) //檢測檔案是否被鎖住
{
    string[] header = null;

    //1.先把本地原始資料讀取上來反序列化成類
    var states = serializer.Deserialize(reader.ReadToEnd(), ref header);

    logger.Log(Level.DEBUG, $"1、原始檔案已經轉換成實體類.");
    Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 1、原始檔案已經轉換成實體類.");

    if (header != null)
    {
         Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] - 檔案頭:{string.Join(",", header)}");
         logger.Log(Level.DEBUG, $"檔案頭:{string.Join(",", header)}");
    }

    //2.把以上資料按照推送格式轉成json資料封包
    string proto = serializer.Serialize(states);

    Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 2、實體類已經協定格式生成json封包.");
    logger.Log(Level.DEBUG, "2、實體類已經協定格式生成json封包.");
    //3.推送到伺服器
    sendMessage(proto);

    Trace.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}] 3、封包已經推送到伺服器.");
    logger.Log(Level.DEBUG, "3、封包已經推送到伺服器.");
}      

發現在多線程執行的過程中

c# 讀寫檔案時檔案正由另一程式使用,是以該程式無法通路該檔案,在IO處理上遇到了無法操作的問題
using (var fs = new FileStream(fileinfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
....
}      

繼續閱讀