C# 使用File.AppendAllText()后另一进程正在使用的文件

C# 使用File.AppendAllText()后另一进程正在使用的文件,c#,file,system,saving-data,C#,File,System,Saving Data,进程无法访问文件“文件路径”,因为另一进程正在使用该文件 我发现了这两个问题 及 这是一个API,我需要保存传入的每个请求和传出的结果, 在给定的时间内,可能会有多个请求 我的代码 public static void SaveTheRequestAndResponse(string type, SearchRequest searchRequest = null, dynamic result = null) { var FilePath = AppDomain.CurrentDo

进程无法访问文件“文件路径”,因为另一进程正在使用该文件

我发现了这两个问题

这是一个API,我需要保存传入的每个请求和传出的结果, 在给定的时间内,可能会有多个请求 我的代码

public static void SaveTheRequestAndResponse(string type, SearchRequest searchRequest = null, dynamic result = null)
{
    var FilePath = AppDomain.CurrentDomain.BaseDirectory + @"SearchRequest";
    bool exists = Directory.Exists(FilePath);
    if (!exists)
    {
      var stream =  Directory.CreateDirectory(FilePath);
    }
    if (type == "request")
    {

        string Space = ", ";
        StringBuilder request = new StringBuilder();

        request.Append("Search Id : " + searchRequest.ID);
        request.Append(Space + "Company Name : " + searchRequest.CompanyName);
        request.Append(Space + "Country Code : " + searchRequest.CountryCode);

        request.Append(Space + "Search Type : " + searchRequest.SeacrhType);

        request.Append(Space + "Request Time : " + DateTime.Now + Environment.NewLine);

        var DataToBeSave = request.ToString();

        System.IO.File.AppendAllText(FilePath + @"\" + "FileNAme" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);

    }
    else
    {
        string Space = ", ";
        StringBuilder SearchResult = new StringBuilder();
        SearchResult.Append("The result for Request" + Space);
        SearchResult.Append("Search Id : " + searchRequest.ID + Space);
        SearchResult.Append("States Code : " + result.StatusCode + Space);
        SearchResult.Append("Result Time : " + DateTime.Now + Environment.NewLine);

        var DataToBeSave = SearchResult.ToString();
        System.IO.File.AppendAllText(FilePath + @"\" + "FileNAme" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);

    }
}

我的理解是,File.AppendAllText将在操作后关闭,因此为什么会出现此错误?我的代码有一个争用条件,这是因为API在每个给定的时间都被多个用户调用,即使如此

System.IO.File.AppendAllText(FilePath + @"\" + "FileNAme" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);
将在操作后关闭,它仍然需要时间来完成其工作,并且每次只能打开一个连接,因此线程需要锁定,这可以由

private static Object thisLock = new Object();
lock (thisLock)
{
    System.IO.File.AppendAllText(FilePath + @"\" + "DandB" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);
}

多亏了

我的代码有一个争用条件,这是因为API在每个给定的时间都被多个用户调用,即使是这样

System.IO.File.AppendAllText(FilePath + @"\" + "FileNAme" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);
将在操作后关闭,它仍然需要时间来完成其工作,并且每次只能打开一个连接,因此线程需要锁定,这可以由

private static Object thisLock = new Object();
lock (thisLock)
{
    System.IO.File.AppendAllText(FilePath + @"\" + "DandB" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", DataToBeSave + Environment.NewLine);
}

多亏了

在为每个web请求写入文件时,您需要处理可能发生的争用情况。如果两个请求几乎同时进行,则两个请求都将尝试同时写入该文件。无需检查Dir是否存在。Directory.CreateDirectory将返回现有的dir或创建一个新的dir(如果路径有效),从何处调用此函数?它们在两个位置被调用,一个是在API获取请求时,二个是在处理请求时,以及在发送请求结果之前back@abydal非常感谢。我不知道什么是竞争条件,现在我知道了,我正在锁定文件保存,问题已经解决。当您为每个web请求写入文件时,您需要处理可能发生的竞争条件。如果两个请求几乎同时进行,则两个请求都将尝试同时写入该文件。无需检查Dir是否存在。Directory.CreateDirectory将返回现有的dir或创建一个新的dir(如果路径有效),从何处调用此函数?它们在两个位置被调用,一个是在API获取请求时,二个是在处理请求时,以及在发送请求结果之前back@abydal非常感谢。我不知道什么是竞争条件,现在我知道了,我正在锁定文件保存,问题已经解决。我有保存问题。使用锁我现在工作正常。谢谢我有保存问题。使用锁我现在工作正常。谢谢