当程序第二次运行时,File.AppendAllText会引发访问异常

时间:2017-01-26 12:37:35

标签: c# .net file logging msdn

我有一个日志文件,我每次启动应用程序时都会删除并创建:

if (File.Exists(LogPath))
{
   File.Delete(LogPath);
   File.Create(LogPath);
}

我正在使用File.AppendAllText这样写:

File.AppendAllText(LogPath, logMessage);

我的问题是,当我第二次运行程序时,上面的调用会导致抛出异常,说文件无法访问

  

"因为它正被另一个进程使用"

这种方法有什么问题?

4 个答案:

答案 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