Uma boa solução para descobrir bugs no software quando o software está em fase de teste ou até mesmo instalado é criando um arquivo texto de log, que pode ser armazenado no diretório da própria aplicação. Um cuidado que observei na criação de um arquivo de log é o método que utilizamos para criar o arquivo.
Inicialmente utilizei a classe File e o método Create do namespace System.IO:
// Verifica se o arquivo de log da aplicação já existe
if (!File.Exists("log_aplicacao.txt"))
{
File.Create("log_aplicacao.txt");
}
if (!File.Exists("log_aplicacao.txt"))
{
File.Create("log_aplicacao.txt");
}
O código acima funciona sem problemas desde que o software execute várias outras operações antes de tentar escrever no arquivo de log. Se a próxima operação for por exemplo gravar a iniciação do software logo após criar o arquivo, o software apresentará uma exceção com uma mensagem parecida com “O processo não pode acessar o arquivo log.txt, porque ele está sendo usado por outro processo”.
Esta exceção ocorre pois enquanto o arquivo está sendo criado o objeto FileStream criado por este método tem um valor default (FileShare de None), ou seja, nenhum outro processo ou código pode acessar o arquivo criado até que o handle do arquivo original seja fechado.
Uma possível solução foi utilizar a classe FileStream e passar o parâmetro FileShare como ReadWrite.
// Cria o arquivo de log da aplicação
FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Close();
FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Close();
Desde modo logo após a criação do arquivo já é possível escrever no arquivo de log. Segue um exemplo para gravar no log da aplicação a data e hora em que a aplicação foi iniciada.
static void Main(string[] args)
{
try
{
// Verifica se o arquivo de log da aplicação já existe
if (!File.Exists("log_aplicacao.txt"))
{
// Cria o arquivo de log da aplicação
FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Close();
}
{
try
{
// Verifica se o arquivo de log da aplicação já existe
if (!File.Exists("log_aplicacao.txt"))
{
// Cria o arquivo de log da aplicação
FileStream fs = new FileStream("log_aplicacao.txt", FileMode.Create,
FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Close();
}
// Cria o objeto StreamWriter, passando como parâmetro o nome do
// arquivo criado anteriormente e o valor booleano true
// indicando que as informações devem ser acrescentadas no arquivo
// toda vez que a aplicação for iniciada criando desta forma um
// arquivo de log com um histório de iniciação da aplicação.
using (StreamWriter sw = new StreamWriter("log_aplicacao.txt", true))
{
sw.WriteLine("A aplicação iniciada em " + DateTime.Now.ToString());
sw.Flush();
sw.Close();
}
// arquivo criado anteriormente e o valor booleano true
// indicando que as informações devem ser acrescentadas no arquivo
// toda vez que a aplicação for iniciada criando desta forma um
// arquivo de log com um histório de iniciação da aplicação.
using (StreamWriter sw = new StreamWriter("log_aplicacao.txt", true))
{
sw.WriteLine("A aplicação iniciada em " + DateTime.Now.ToString());
sw.Flush();
sw.Close();
}
Console.WriteLine("O arquivo foi gerado com suceso!");
}
catch (IOException ex)
{
Console.WriteLine(ex.Message);
}
}
catch (IOException ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}