Eu tenho um serviço do Windows grava seu log em um arquivo de texto em um formato simples.
Agora, vou criar um pequeno aplicativo para ler o log do serviço e mostrar o log existente e o adicionado como visualização ao vivo.
O problema é que o serviço bloqueia o arquivo de texto para adicionar as novas linhas e, ao mesmo tempo, o aplicativo visualizador bloqueia o arquivo para leitura.
O Código de Serviço:
void WriteInLog(string logFilePath, data)
{
File.AppendAllText(logFilePath,
string.Format("{0} : {1}\r\n", DateTime.Now, data));
}
O código do visualizador:
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();
}
}
Existe algum problema no meu código de leitura e escrita?
Como resolver o problema?
Respostas:
Você precisa se certificar de que tanto o serviço quanto o leitor abrem o arquivo de log não exclusivamente. Experimente isto:
Para o serviço - o escritor em seu exemplo - use uma
FileStream
instância criada da seguinte maneira:Para o leitor, use o mesmo, mas altere o acesso ao arquivo:
Além disso, como
FileStream
implementos,IDisposable
certifique-se de que, em ambos os casos, você considere usar umausing
instrução, por exemplo, para o escritor:Boa sorte!
fonte
FileStream
implementaIDisposable
Configure explicitamente o modo de compartilhamento enquanto lê o arquivo de texto.
fonte
-> isso não bloqueia o arquivo.
fonte
O problema é que, quando você está gravando no log, está bloqueando exclusivamente o arquivo para que seu StreamReader não tenha permissão para abri-lo.
Você precisa tentar abrir o arquivo no modo somente leitura .
fonte
File.ReadAllText()
falha com o modo somente leitura.UnauthorizedAccessException
se o arquivo for somente leitura - deve ter esquecido isso no momento da resposta!Lembro-me de fazer a mesma coisa alguns anos atrás. Depois de algumas consultas no Google, encontrei o seguinte:
ou seja, use o atributo FileShare.ReadWrite em FileStream ().
(encontrado no blog de Balaji Ramesh )
fonte
Você já tentou copiar o arquivo e depois lê-lo?
Basta atualizar a cópia sempre que grandes mudanças forem feitas.
fonte
Este método o ajudará a ler um arquivo de texto mais rapidamente e sem bloqueá-lo.
Espero que este método ajude você.
fonte