我做了一个程序,分为一个 winform 的 exe, 还有一个 windows service 在后台作一些日志操作。
日志是利用 log4net 记录到文本文件里的。
现在我的 winform 里想做一个浏览日志的功能,但是我读取文件的时候,总是发生异常,说该文件被另一个进程占用(应该就是我的 service),因此无法访问。读取文件的地方代码如下:StringBuilder content = new StringBuilder();FileInfo fi = new FileInfo(filePath);
using (FileStream fs = fi.OpenRead())
{
byte[] b = new byte[1024];
Encoding encoding = Encoding.GetEncoding("GB2312"); while (fs.Read(b, 0, b.Length) > 0)
{
content.Append(encoding.GetString(b));
}
}
txtLog.Text = content.ToString();请问如何修改代码才能够保证读取成功而不会发生进程占用的冲突。谢谢!

解决方案 »

  1.   

    我想是因为你的windows service正在写日志,关联了那个日志文件,所以别的进程访问不了这个文件。 
    你用StreamReader读,读的时候设置成共享读试一下。
      

  2.   

    试过了,没有用。FileMode, FileAccess, FileShare 都设置了也不行。但是我在 windows 系统的资源管理器里面能够双击查看文本文档的。我就是想做到像操作系统的权限一样,随时可以有权限查看。谁知道怎么做?
      

  3.   


    我想是因为你的windows service正在写日志,关联了那个日志文件,所以别的进程访问不了这个文件。 
    你用StreamReader读,读的时候设置成共享读试一下。

    如可设成只读?
      

  4.   

    这个问题我也遇到了,我的解决办法是最外面写个死循环(while(true)),里面用try和catch()捕捉,让程序无限循环直到另一个进程结束占用这个文件为止,然后break一下。估计这是C#后台清理内存程序或是windows自身内存操作的一些问题。
      

  5.   

    我前段时间做的一个项目刚好遇到和lz一样的问题
    我的解决方法如下,也就是做一份copy,读取copy的那一份,这样就不会有读取的冲突了。
    //创建该文件的目的在于File.Copy的使用,因为如果源文件正被酒店端读取,通过此方式可以防止被另一进程读取的错误
    File.Copy(fullPath, tmp, true);//打开只读方式
    fs = new FileStream(tmp, FileMode.Open, FileAccess.Read);
    //使用StreamReader类来读取文件,页默认编码***
    sr = new StreamReader(fs, System.Text.Encoding.Default);
    //从数据流中读取每一行,直到文件的最后一行
    sr.BaseStream.Seek(0, SeekOrigin.Begin);
    //读取到字符串中
    iisLog = sr.ReadToEnd();