首页 > 解决方案 > 进程无法访问文件,因为它被 mscorlib.dll 使用

问题描述

我写了一个 .dll 文件,它创建了带有 csv 扩展名的日志文件。问题是,只要它需要创建路径(因为它不存在),它就无法访问文件以在其中写入内容

void InitializePathDirectory(string dir)
{
    if (!Directory.Exists(dir))
    {
        Directory.CreateDirectory(dir);
    }
}

void InitializeFileDirectory(string file)
{
    if (!File.Exists(file))
    {
        File.Create(file);
    }
}

这里的路径是

private string dirname = $"{path}\\Logs";
private string filename = $"{path}\\Logs\\{DateTime.Now.ToString("dd.MM.yyyy")}.csv";

当我关闭使用此 dll 的应用程序时,它通常会将我关闭应用程序的时间写入日志文件

public void onExit()
{
    //var a is the DateTime, when the application starts
    var b = DateTime.Now;

    string temp = Convert.ToString(b - a);
    string[] time = temp.Split('.');

    File.AppendAllText(filename, $"Time:; {time[0]}\n");
    File.AppendAllText(filename, $"Starttime:; {a.ToString("HH:mm:ss")}\n");
    File.AppendAllText(filename, $"Endtime:; {b.ToString("HH:mm:ss")}\n\n");
}

但如果日志文件路径是在同一次运行中创建的,我无法将任何内容写入文件,它会引发异常,即“mscorlib.dll”当前使用日志文件,所以我无法访问它

标签: c#

解决方案


UsingFile.Create()返回一个文件流,它允许您读取/写入新创建的文件。如果不处理/关闭此流,它将导致文件保持打开状态,从而阻止您随后调用File.AppendAllText().

您有2 3种方法来处理此问题:

  1. 将您的调用包含在 using 块中:using (File.Create(filename)) {}
  2. 手动调用文件流上的 dispose:File.Create(filename).Dispose();
  3. 根本不要使用File.Create()。该File.AppendAllText()方法已经检查文件是否存在,如果不存在则创建它,因此File.Create()完全多余且没有必要:

    打开文件,将指定的字符串附加到文件,然后关闭文件。如果文件不存在,此方法创建一个文件,将指定的字符串写入文件,然后关闭文件。

最后,正如@Tofik在现已删除的答案中指出的那样,您的呼叫Directory.Exists(dir)也是多余的。请参阅文档Directory.CreateDirectory(dir)

在指定路径中创建所有目录和子目录,除非它们已经存在。


推荐阅读