2017-08-04 446 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

相關問題