Файл заблокирован сервисами (после чтения кода сервиса из текстового файла) - PullRequest
0 голосов
/ 09 июня 2010

У меня есть службы Windows, написанные на C # .NET. Служба работает на внутреннем таймере, каждый раз, когда интервал достигает, он будет пытаться прочитать этот файл журнала в строку.

Моя проблема заключается в том, что каждый раз, когда файл журнала читается, служба, кажется, блокирует файл журнала. Блокировка этого файла журнала будет продолжаться до тех пор, пока я не остановлю службу 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 ]

2 голосов
/ 09 июня 2010

Я бы предложил закрыть файл в операторе 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 голос
/ 09 июня 2010

Попробуйте использовать:

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();
    }
}
0 голосов
/ 09 июня 2010

Вам необходимо использовать форму с четырьмя аргументами FileStream и включить маску доступа FileShare.Read:

var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

Таким образом, файл открывается таким образом, что допускается одновременное чтение нескольких файлов. Кроме того, код, который записывает файл, также должен открыть его с помощью FileShare.Read.

...