我有一个日志文件,我每次启动应用程序时都会删除并创建:
if (File.Exists(LogPath))
{
File.Delete(LogPath);
File.Create(LogPath);
}
我正在使用File.AppendAllText
这样写:
File.AppendAllText(LogPath, logMessage);
我的问题是,当我第二次运行程序时,上面的调用会导致抛出异常,说文件无法访问
"因为它正被另一个进程使用"
这种方法有什么问题?
答案 0 :(得分:4)
由CustomUrlRule
引起。删除它,File.Create()
创建一个新文件,如果它不存在。
注意:强>
File.AppendAllText
返回File.Create()
值,如果您不处理它,那么当您想要访问它时会导致错误。
答案 1 :(得分:3)
这不是因为File.AppendAllText
而是因为这行代码:
File.Create(LogPath);
根据the documentation of File.Create(string):
返回值
中指定的文件的读/写访问
键入:System.IO.FileStream
FileStream,提供对path。
返回一个开放的FileStream
对象。您需要处置此对象才能关闭流并释放文件。如果不这样做,则此对象将保持文件打开,直到GC在稍后的不确定时间点完成对象。
以下是编写此行代码的方法,以下两种方法之一可以使用:
File.Create(LogPath).Dispose();
using (File.Create(LogPath)) { }
发生的事情是你的程序第二次运行该文件存在,所以你删除它然后重新创建它,但“重新创建它”部分保持文件打开,所以当它在很短的时间后到达{{1方法,文件仍然打开。
注意:如果您始终致电File.AppendAllText
,您只需将其删除即可,因为File.AppendAllText
会创建该文件已经存在,根据the documentation of File.AppendAllText:
打开文件,将指定的字符串附加到文件,然后关闭该文件。 如果文件不存在,则此方法创建文件,将指定的字符串写入文件,然后关闭文件。
(我的重点)
答案 2 :(得分:0)
创建后需要关闭文件以进行进一步处理。
if (File.Exists(LogPath))
{
File.Delete(LogPath);
using(var handler = File.Create(LogPath))
{
}
}
其他方式可能是使用WriteAllText,您不需要每次都删除它。
File.WriteAllText(LogPath, "contents");
答案 3 :(得分:0)
你可能意味着
// clear the file (write an empty text to it) if it exists
if (File.Exists(LogPath))
{
File.WriteAllText(LogPath, "");
}
...
File.AppendAllText(LogPath, logMessage);
你可以在一次通话中尝试结合清算和写作:
File.WriteAllText(LogPath, logMessage);
如果文件存在,WriteAllText
将清除该文件并写入logMessage
;如果文件不存在,WriteAllText
将创建它并写入logMessage
。