zoukankan      html  css  js  c++  java
  • c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件,在IO处理上遇到了无法操作的问题

    问题场景:process1.exe向目录c:syslog写入文件,文件格式${unixtimestamp}.txt

    process2.exe从c:syslog读取文件

    读取的频率比较高,大概毫秒级别100-500ms

    一开始的思路

    初始代码:

    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、报文已经推送到服务器.");
    }

    发现在多线程执行的过程中

    后来在stackoverflow上找到答案:Reading a file used by another process [duplicate] 

    读取文件代码体改成以下即可

    using (var fs = new FileStream(fileinfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    ....
    }
  • 相关阅读:
    UltraSoft
    UltraSoft
    UltraSoft
    UltraSoft
    UltraSoft
    2020软工提问回顾与个人总结作业
    2020软工结对项目作业-简单几何形状间交点统计
    2020软工个人博客作业-博客园班级博客分析
    2020软工个人阅读博客作业
    2020软工第一次作业-热身
  • 原文地址:https://www.cnblogs.com/passedbylove/p/9260255.html
Copyright © 2011-2022 走看看