2017-08-04 448 views
0

进程无法访问文件'文件路径',因为它正在被另一个进程使用。使用File.AppendAllText()后另一个进程正在使用的文件

我发现这2个问题

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将动作,以使后关闭为什么我得到了这个错误

+1

当您为每个Web请求写入文件时,您需要处理可能发生的争用情况。如果两个请求或多或少同时发生,它们都将尝试同时写入文件。 – abydal

+0

无需检查Dir是否存在。 Directory.CreateDirectory将返回现有的目录或创建一个新的目录(如果路径有效) –

+0

你从哪里调用这个函数? – martennis

回答

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

相关问题