【问题标题】:How do I solve the error "The Process Cannot access the file because it is being used by another process"如何解决错误“进程无法访问该文件,因为它正在被另一个进程使用”
【发布时间】:2015-06-15 06:26:15
【问题描述】:

我正在尝试使用下面给出的代码创建一个日志文件,但它引发了以下错误:-

进程无法访问该文件,因为它正在被另一个人使用 进程

请在这方面帮助我。

代码如下:-

string logFile = System.IO.Directory.GetCurrentDirectory() + "\\LogFile\\" + DateTime.Now.ToString("dd-MM-yyyy") + "TaskLogFile.txt";
StreamWriter LogWriter = null;

try
{
    if (!File.Exists(logFile))
    {      
        LogWriter = new StreamWriter(logFile);
        Console.WriteLine("Log File Created...");
    }
    else
    {
        LogWriter = File.AppendText(logFile);
        Console.WriteLine("Log File Appended...");
    }

    if (EX == null)
    {
        LogWriter.Write("\r\nLog Entry : ");
        LogWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
        LogWriter.WriteLine("\nTask Id = {0} , Task Name = {1}, Service Name = {2} ", TaskId, TaskName, ServiceName);
        LogWriter.WriteLine("-----------------------------------------------------------------------------------------------------");
    }

    else
    {
        LogWriter.WriteLine("\n Error : {0}, Error Location : {1},Task ID = {2}, Task Name : {3}, Service Name : {4} " + EX.ToString(), EX.StackTrace, TaskId, TaskName, ServiceName);
    }

}

catch (Exception ex)
{
    LogWriter = File.AppendText(logFile);
    LogWriter.WriteLine("\n Error : {0}" + ex.ToString());
}


finally
{
    if (LogWriter != null)
    {
        LogWriter.Close();     
    }
    LogWriter = null;
}

【问题讨论】:

  • 文件操作期间的异常不会关闭文件句柄 - 您的 catch 子句正在尝试打开已经打开的文件(用于写入,禁用共享)。更不用说catch 的范围如此广泛,它可能会在最初打开文件时或在执行WriteLine 等时捕获错误。哦,别忘了其他人可能会将文件打开为好吧:)
  • 一旦你确定你自己已经修复了你的代码,你可以使用SysInternals Process Explorer来确定是否有其他东西锁定它。
  • @Luaan 我试图忽略异常,但错误仍然存​​在。
  • 如果您在多个线程上使用该函数,您可能希望等待文件可访问,例如 stackoverflow.com/questions/12268067/… 如果您不需要自己实现日志记录,则可以使用日志框架,如log4net
  • 您可能应该使用像 log4net 这样的日志库,而不是尝试自己编写。文件管理和多线程访问只是您需要解决的两个问题。此外,.NET 已经提供了日志记录支持,确实解决了这些问题

标签: c#


【解决方案1】:

用这个更新你的 catch(){} 块并尝试;

catch (Exception ex)
    {

        if (LogWriter != null)
        {
            LogWriter.Close();     
        }
        LogWriter = File.AppendText(logFile);
        LogWriter.WriteLine("\n Error : {0}" + ex.ToString());
    }

希望对您有所帮助..!

【讨论】:

    【解决方案2】:

    我建议使用File.AppendAllText() 方法,因为它是最简单的解决方案,非常适合此目的。此方法完全符合您的记录器应该做的 - 它打开一个文件,在其上附加一行文本(或文本行数)并立即关闭它。

    为什么要使用文件流?

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多