文件被服务锁定(在读取文本文件的服务代码之后)

时间:2010-06-08 21:15:47

标签: c# .net file locking service

我有一个用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;
    }

谢谢。

3 个答案:

答案 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打开它。