使用File.AppendAllText()后由另一个进程使用的文件

时间:2017-08-04 11:16:36

标签: c# file system saving-data

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

我找到了这两个问题

File being used by another process after using File.Create()

Does File.AppendAllText close the file after the operation

这是我拥有的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将在Operation之后关闭,为什么我会收到此错误

1 个答案:

答案 0 :(得分:1)

我的代码存在竞争条件,这是因为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);
}

感谢Abydal