C# 过程可以';无法访问文件导致它';mscorlib.dll使用的

C# 过程可以';无法访问文件导致它';mscorlib.dll使用的,c#,C#,我编写了一个.dll文件,它创建了具有csv扩展名的日志文件。问题是,每当它需要创建路径时(因为它不存在),它就无法访问文件以在其中写入内容 void InitializePathDirectory(string dir) { if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } } void InitializeFileDirectory(string file) { i

我编写了一个.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”当前使用该日志文件,因此我无法使用返回的文件流访问它,该文件流允许您读取/写入新创建的文件。如果不处理/关闭此流,它将导致文件保持打开状态,从而阻止后续调用
file.AppendAllText()

您有2种3种处理方法:

  • 将调用包含在using块中:
    using(File.Create(filename)){}
  • 手动调用filestream上的dispose:
    File.Create(filename.dispose()
  • 根本不要使用
    File.Create()
    。该方法已检查该文件是否存在,如果不存在,将创建该文件,因此
    file.create()
    是完全冗余的,不需要: 打开一个文件,将指定的字符串附加到该文件,然后关闭该文件如果文件不存在,此方法将创建一个文件,将指定字符串写入该文件,然后关闭该文件

  • 最后,正如在一个现已删除的答案中指出的,您对
    Directory.Exists(dir)
    的调用也是冗余的。有关以下内容,请参阅文档:

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


    尝试关闭
    file.Create
    返回的文件流。
    file.Create(文件)返回您保持打开状态的文件流。您不需要创建文件,只需跳过“InitializeFileDirectory”方法即可。当您调用“File.AppendAllText”时,将自动创建该文件。如果您用File.Create()射中左脚,则会自动创建该文件。记录文件的一个好做法是尽早创建它们,并在程序生命周期内保持它们的打开状态。和使用日志库。如果下面的答案之一回答了您的问题,即此网站的工作方式,您将“接受”答案,更多信息如下:。但前提是你的问题真的得到了回答。如果没有,考虑在问题中添加更多的细节。