Erreur de reecriture dans un fichier [VB.Net] - thread-safe

Résolu
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008 - 6 janv. 2005 à 17:50
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008 - 7 janv. 2005 à 16:37
Bonjour à tous,

je code en vb .net. et j'ai besoin d'aide, svp
Je cree un fichier de log pour une appli, que je veux relire apres , dans une form qui pourra me donner les journaux par date. Ca fonctionnait tres bien jusqu'a ce que j'inclue de nouvelles mises a jour dans cette application, et qui me donnennt un resultat:
"Le processus ne peut pas acceder au fichier "...\rapport.log" car il est en cours d'utilisation par un autre processus". Je ne comprends pas, meme en debuggage je referme bien mon streamreader, avant de vouloir l'effacer.

Voici le bout du code qui pose probleme:

File.Create(dossier_Rapport & "\RapportTmp.log")
Dim journal As StreamReader = File.OpenText(dossier_Rapport & "\Rapport.log")
'Wait(10)
Do
buffer = journal.ReadLine()
If buffer <> "" Then
If InStr(buffer, "Journal au :") Then
Dim i As Integer = buffer.IndexOf(":")
Dim dateJournal As String = buffer.Substring(i + 2, 10)
If DateDiff(DateInterval.Day, CDate(dateJournal), Now) > 30 Then
Do
buffer = journal.ReadLine
Loop Until InStr(buffer, "--------------") <> 0
Else
Dim journalTmp As StreamWriter = File.AppendText(dossier_Rapport & "\RapportTmp.log") // on ouvre un streamwriter temporaire
Do
journalTmp.WriteLine(buffer)
buffer = journal.ReadLine
Loop Until InStr(buffer, "--------------") <> 0
journalTmp.WriteLine("---------------------------------------------------")
journalTmp.Close() // on ferme a chaque fois le temporaire
Wait(5)
End If
End If
End If
Loop Until buffer Is Nothing
journal.Close() // LA JE FERME BIEN LE STREAMREADER NON????
Wait(5)
...

le wait (si vous vous demandez ce que c'est):
Private Shared Sub Wait(ByVal n As Integer)
For i As Integer = 1 To n
System.Threading.Thread.Sleep(1)
Application.DoEvents()
Next
End Sub

Et donc, je ne sais plus quoi faire, je dois bientot rendre cette appli
pas cool, donc

je me demandais si ca n'avait pas quelquechose a voir avec ce qui est appelé "thread safe" et tout ca.
Si l'un d'entre vous peut m'eclairer a ce sujet, ce serait cool.

MERCI D'AVANCE
Vaut mieux etre bourré que con: ca dure moins longtemps...

3 réponses

cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
7 janv. 2005 à 14:32
Salut, déjà si tu rencontre des erreurs c'est qu'un utilisateur pourra aussi en rencontré, donc place le tout dans un Try Catch Finally comme ceci :

Dim journal As StreamReader = File.OpenText(dossier_Rapport &amp; "\Rapport.log")

'Wait(10)

Try
   Do
      buffer = journal.ReadLine()

      If buffer <> "" Then

         If InStr(buffer, "Journal au :") Then

               Dim i As Integer = buffer.IndexOf(":")
               Dim dateJournal As String = buffer.Substring(i + 2, 10)

               If DateDiff(DateInterval.Day, CDate(dateJournal), Now) > 30 Then
                  Do
                     buffer = journal.ReadLine
                  Loop Until InStr(buffer, "--------------") <> 0
               Else

                  Try
                     Dim journalTmp As StreamWriter = File.AppendText(dossier_Rapport &amp; "\RapportTmp.log") // on ouvre un streamwriter temporaire

                     Do
                        journalTmp.WriteLine(buffer)
                        buffer = journal.ReadLine
                     Loop Until InStr(buffer, "--------------") <> 0

                     journalTmp.WriteLine("---------------------------------------------------")

                  Catch ex2......
                     messagebox.shox(ex2.tostring)
                  Finally
                     journalTmp.Close() // on ferme a chaque fois le temporaire
                  End Try

                  Wait(5)
               End If
            End If
         End If
         
         Loop Until buffer Is Nothing

   catch ex.......
      messagebox.show(ex.tostring)
   Finally
         journal.Close()

   End Try

Wait(5)



Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
3
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
7 janv. 2005 à 14:34
Petite correction :

Try
   Dim journal As StreamReader = File.OpenText(dossier_Rapport &amp; "\Rapport.log")

   'Wait(10)

   .
   .
   .


Au tout début du code que j'ai noter

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
3
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
7 janv. 2005 à 16:37
Merci bien, ca va m'aider, mais j'ai trouvé une autre erreur de fermeture dans une procedure d'initialisation d'un autre form, qui n'etait pas sensé influer ici, ou alors me donner une erreur lors de l'instanciation d'un nouveau streamreader.
Lorsque j'avais essayé d'inserer un autre try catch dans celui ci j'avais eu une erreur, donc je me suis dit que ce n'etait pas possible. Le finally, je ne l'ai pas utilisé mais c'est bien pratique effectivement.
J'ai commencé le.net cette annéé, donc j'ai plein de fonctions a decouvrir et a apprendre

Merci beaucoup encore Chris

Vaut mieux etre bourré que con: ca dure moins longtemps...
0