我已經實現了一個基本的日誌記錄類,當我嘗試創建它的新實例時,我得到以下異常。爲什麼我會得到關於另一個進程正在使用的文件的IO異常?
該進程無法訪問文件'C:\ Users \ carl \ Desktop \ My Projects \ TCV2 \ CallPotential.UI \ bin \ Debug \ application.log',因爲它正在被另一個進程使用。
這裏是記錄器類的代碼。
using System;
using System.IO;
using System.Reflection;
namespace CallPotential.Utilities
{
public class Logger : IDisposable
{
/// <summary>
/// Used to write output to the log file.
/// </summary>
private StreamWriter _stream;
/// <summary>
/// The absolute path to the log files location.
/// </summary>
public String LogFileName
{
get
{
// get the directory where our main assembly is located.
Assembly assembly = Assembly.GetExecutingAssembly();
String directoryName = Path.GetDirectoryName(assembly.Location);
return Path.Combine(directoryName, "application.log");
}
}
/// <summary>
/// Creates a new instance of the Logger class
/// </summary>
public Logger()
{
_stream = new StreamWriter(LogFileName);
}
/// <summary>
/// Writes a message out to the application log file.
/// </summary>
/// <param name="message">The message to write to the log file.</param>
public void Write(String message)
{
_stream.WriteLine(message);
_stream.Flush();
_stream.Close();
}
/// <summary>
/// Writes a message including the applications state to the log file.
/// </summary>
/// <param name="state">The application state at the time of the logged message.</param>
/// <param name="message">The message to be written to the log file.</param>
public void Write(AppState state, String message)
{
Write(String.Format("{0}\r\n\t{1}", state, message));
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (disposing)
{
if (_stream != null)
{
_stream.Dispose();
_stream = null;
}
}
}
~Logger()
{
Dispose(false);
}
}
}
注意確定爲什麼,但它會在構造函數中拋出異常。任何幫助搞清楚這一點將不勝感激。
一種可能(我已經打了這一點)是寫入文件,並關閉它會觸發autovirus掃描儀,這將打開文件並阻止打開寫,當您登錄下一次。嘗試從病毒掃描中排除文件或目錄。 – 2012-08-06 21:20:47
在我的開發機器上沒有安裝殺毒軟件,所以不能這樣做。我認爲myapplication.vhost對文件有鎖定,但我不確定。 – 2012-08-06 21:21:39
在構造函數中,爲什麼你需要一個屬性來返回一個路徑?如果你總是希望文件與exe文件位於同一個目錄中,你可以使用新的StreamWriter(「application.log」);此外寫功能使用關閉,這是故意的,因爲你只能寫一次。你會希望close函數在dispose方法中。 – craig1231 2012-08-06 21:25:48