2017-08-04 2 views
0

Le processus ne peut pas accéder au fichier 'chemin du fichier' car il est utilisé par un autre processus.Fichier utilisé par un autre processus après l'utilisation de File.AppendAllText()

j'ai trouvé ces 2 questions

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

et

Does File.AppendAllText close the file after the operation

ceci est une API que j'ai et besoin de sauver chaque requête qui est fournie et le résultat qui va dehors, il pourrait y avoir plus d'une demande qu'un donner le temps mon code

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); 

    } 
} 

je crois comprendre que la File.AppendAllText fermera après l'opération alors pourquoi puis-je obtenir la cette erreur

+1

Lorsque vous écrivez un fichier pour chaque requête Web, vous devez gérer la condition de course qui peut se produire. Si deux demandes sont plus ou moins simultanées, les deux essaieront d'écrire dans le fichier en même temps. – abydal

+0

pas besoin de vérifier si Dir existe. Directory.CreateDirectory retournera un répertoire existant ou en créera un nouveau (si le chemin est valide) –

+0

D'où appelez-vous cette fonction? – martennis

Répondre

1

mon code est d'avoir une condition de course, ce qui est parce que l'API est en cours de l'appel de plus de un utilisateur à chaque fois donné, même que

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

fermera après l'opération, il faut encore le temps faire son travail et une seule connexion peut être ouverte à chaque donner le temps de sorte que le fil doit être verrouillage et qui peut être fait par

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

Merci à Abydal