У меня служба Windows записывает свой журнал в текстовый файл в простом формате.
Теперь я собираюсь создать небольшое приложение для чтения журнала службы и отображения существующего журнала и добавленного в режиме реального времени.
Проблема в том, что служба блокирует текстовый файл для добавления новых строк, и в то же время приложение просмотра блокирует файл для чтения.
Сервисный код:
void WriteInLog(string logFilePath, data)
{
File.AppendAllText(logFilePath,
string.Format("{0} : {1}\r\n", DateTime.Now, data));
}
Код зрителя:
int index = 0;
private void Form1_Load(object sender, EventArgs e)
{
try
{
using (StreamReader sr = new StreamReader(logFilePath))
{
while (sr.Peek() >= 0) // reading the old data
{
AddLineToGrid(sr.ReadLine());
index++;
}
sr.Close();
}
timer1.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
using (StreamReader sr = new StreamReader(logFilePath))
{
// skipping the old data, it has read in the Form1_Load event handler
for (int i = 0; i < index ; i++)
sr.ReadLine();
while (sr.Peek() >= 0) // reading the live data if exists
{
string str = sr.ReadLine();
if (str != null)
{
AddLineToGrid(str);
index++;
}
}
sr.Close();
}
}
Есть ли в моем коде проблемы с чтением и записью?
Как решить проблему?
Ответы:
Вам необходимо убедиться, что и служба, и читатель открывают файл журнала неэксклюзивно. Попробуй это:
Для службы - писателя в вашем примере - используйте
FileStream
экземпляр, созданный следующим образом:var outStream = new FileStream(logfileName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
Для ридера используйте то же самое, но измените доступ к файлу:
var inStream = new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Кроме того, поскольку
FileStream
реализации,IDisposable
убедитесь, что в обоих случаях вы рассматриваете возможность использованияusing
оператора, например для писателя:using(var outStream = ...) { // using outStream here ... }
Удачи!
источник
FileStream
реализуетIDisposable
Явная настройка режима совместного использования при чтении текстового файла.
using (FileStream fs = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (sr.Peek() >= 0) // reading the old data { AddLineToGrid(sr.ReadLine()); index++; } } }
источник
new StreamReader(File.Open(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
-> это не блокирует файл.
источник
Проблема в том, что когда вы пишете в журнал, вы монопольно блокируете файл, поэтому вашему StreamReader не будет разрешено его открыть.
Вы должны попытаться открыть файл в только для чтения режима.
using (FileStream fs = new FileStream("myLogFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader sr = new StreamReader(fs)) { while (!fs.EndOfStream) { string line = fs.ReadLine(); // Your code here } } }
источник
File.ReadAllText()
не работает с режимом только для чтения.UnauthorizedAccessException
если файл доступен только для чтения - должно быть, пропустил это во время ответа!Я помню, как делал то же самое пару лет назад. После нескольких запросов в Google я обнаружил это:
FileStream fs = new FileStream(@”c:\test.txt”, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
т.е. используйте атрибут FileShare.ReadWrite в FileStream ().
(найдено в блоге Баладжи Рамеша )
источник
Вы пробовали скопировать файл, а затем прочитать его?
Просто обновляйте копию всякий раз, когда вносятся большие изменения.
источник
Этот метод поможет вам быстрее всего прочитать текстовый файл, не блокируя его.
private string ReadFileAndFetchStringInSingleLine(string file) { StringBuilder sb; try { sb = new StringBuilder(); using (FileStream fs = File.Open(file, FileMode.Open)) { using (BufferedStream bs = new BufferedStream(fs)) { using (StreamReader sr = new StreamReader(bs)) { string str; while ((str = sr.ReadLine()) != null) { sb.Append(str); } } } } return sb.ToString(); } catch (Exception ex) { return ""; } }
Надеюсь, этот метод вам поможет.
источник