天天看点

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))
....
}      

继续阅读