我有一个用C#.NET编写的Windows服务。该服务在内部计时器上运行,每当间隔命中时,它将尝试将此日志文件读入字符串。
我的问题是每次读取日志文件时,服务似乎都会锁定日志文件。对该日志文件的锁定将继续,直到我停止Windows服务。在服务检查日志文件的同时,同一日志文件需要由另一个程序不断更新。如果文件锁定,则其他程序无法更新日志文件。
以下是我用来读取文本日志文件的代码。
private string ReadtextFile(string filename)
{
string res = "";
try
{
System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.StreamReader sr = new System.IO.StreamReader(fs);
res = sr.ReadToEnd();
sr.Close();
fs.Close();
}
catch (System.Exception ex)
{
HandleEx(ex);
}
return res;
}
谢谢。
答案 0 :(得分:2)
我建议在Finally
语句中关闭文件以确保它被执行
System.IO.FileStream fs = null;
System.IO.StreamReader sr = null;
try{
fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
sr = new System.IO.StreamReader(fs);
res = sr.ReadToEnd();
}
catch (System.Exception ex)
{
HandleEx(ex);
}
finally
{
if (sr != null) sr.Close();
if (fs != null) fs.Close();
}
或尝试使用using
声明:
using (FileStream fileStream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
...
}
答案 1 :(得分:1)
尝试使用:
using (FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
using(StreamReader sr = new System.IO.StreamReader(fs))
{
res = sr.ReadToEnd();
}
}
答案 2 :(得分:0)
您需要使用FileStream
的四参数形式并包含访问掩码FileShare.Read
:
var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
这样,文件以允许多个并发读取器的方式打开。此外,编写文件的代码也需要使用FileShare.Read
打开它。