2017-09-06 4 views
0

Je ne peux pas l'air d'être en mesure de supprimer des fichiers après une utilisation StreamReader, avec unC# ne peut pas supprimer le fichier après StreamReader utilisation

« fichier ne peut pas être accessible parce que le fichier est utilisé »

erreur en C#.

je manquer quelque chose, mais je ne sais pas quoi, voici le code:

fileEntries = from fullFilename 
    in Directory.EnumerateFiles(@"Data\csv\pending") 
    select Path.GetFileName(fullFilename); 

i = 1; 

foreach (string file in fileEntries) 
{ 
    if(i == 1) 
    { 
     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 

     using (System.IO.FileStream fs = System.IO.File.Create(folder + @"\create-user.csv")) 
     { 

     } 

     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
     { 
      files.WriteLine(",; prenom; nom; username; pasword; email; question; reponse; GroupID"); 
     } 

     string curfile = @"\create-user-archive.csv"; 
     if(!(File.Exists(folder + curfile))) 
     { 
      using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
      { 
       files.WriteLine(",; prenom; nom; username; pasword; email; question; reponse; GroupID"); 
      } 
     } 
    } 


    folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\pending"; 
    sb = new StringBuilder(); 

    filef = new System.IO.StreamReader(folder + @"\create-user-" + i + ".csv"); 
    line = filef.ReadLine(); 

    while ((line = filef.ReadLine()) != null) 
    { 
     sb = new StringBuilder(); 
     sb.AppendLine(line.Substring(0, line.Length)); 
     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
     { 
      files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
     } 

     folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
     using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
     { 
      files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
     } 
    } 
    i++; 
    sourceFile = System.IO.Path.Combine(@"Data\csv\pending", file); 
    File.Delete(sourceFile); 
} 

ne doit pas le fichier cesser d'être utilisé après la StreamReader est terminée? J'ai essayé d'utiliser une fonction qui attend que le fichier soit déverrouillé pour supprimer le fichier, mais il est infini, ce qui signifie qu'il y a un processus sans fin que je dois arrêter, mais je ne vois pas lequel.

+0

où fermez-vous 'filef'? – EpicKip

+0

"Le fichier ne devrait-il pas cesser d'être utilisé après que le lecteur de flux ait fini?" comment l'ordinateur doit-il savoir que vous avez fini d'utiliser le fichier? Vous devez appeler 'Fermer' sur le lecteur. C'est le signe –

+0

Si vous n'ouvriez pas et ne fermiez pas les mêmes fichiers plusieurs fois et que vous vous référez aux mêmes fichiers et dossiers de toutes sortes de façons, il vous serait plus facile de voir ce qui se passe. Par exemple, plutôt que de réutiliser la variable générique 'folder' pour différentes choses, créez-en une appelée' pendingFolder' pour faire référence à '' Data \ csv \ pending ''et une autre' doneFolder' pour faire référence '' "Data \ csv \ fait "". Définissez leur valeur _once_, puis utilisez ces variables au lieu de coder en dur le même chemin ultérieurement. – Rhumborl

Répondre

3

Vous devez fermer filef.

Encapsuler le code dans un communiqué using fermera automatiquement le lecteur

using (System.IO.StreamReader filef = new System.IO.StreamReader(folder + @"\create-user-" + i + ".csv") { 
    ....yourcodehere 
} 

Sinon, appelez filef.Close() lorsque vous avez terminé avec elle (avant de supprimer le fichier)

+0

En effet, je n'ai pas, et mon code n'est pas le plus facile à lire, merci pour l'aide – raiskader

0

Vous avez pour fermer les flux que vous créez pour disposer des ressources système. Vous pouvez utiliser la méthode Close ou le pattern using, car les classes implémentent l'interface IDisposable. Je vous recommanderais à la deuxième option.

mai un coup d'oeil à ce poste: https://stackoverflow.com/a/707339/6244709

+0

Ils sont déjà fermer à peu près tous les flux qu'ils ouvrent (en utilisant 'using'). – cemper93

0

Vous aurez besoin d'appeler ce qui suit:

filef.Close(); 

Cela irait avant votre suppression;

while ((line = filef.ReadLine()) != null) 
      { 
       sb = new StringBuilder(); 
       sb.AppendLine(line.Substring(0, line.Length)); 
       folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
       using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user.csv", true)) 
       { 
        files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
       } 

       folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Data\csv\done"; 
       using (System.IO.StreamWriter files = new System.IO.StreamWriter(folder + @"\create-user-archive.csv", true)) 
       { 
        files.WriteLine(",; " + sb.ToString().Split(';')[1] + ";" + sb.ToString().Split(';')[2] + ";" + sb.ToString().Split(';')[1] + "." + sb.ToString().Split(';')[2] + ";" + GenerateToken(6) + ";" + sb.ToString().Split(';')[3] + ";" + "1" + ";" + "1"); 
       } 
      } 
      i++; 
      sourceFile = System.IO.Path.Combine(@"Data\csv\pending", file); 
      filef.Close(); 
      File.Delete(sourceFile);