Difficulté avec création / supression d'un fichier simulant un jeton
Bonjour,
Je tente d'écrire une application de chat rustique pour mon boulot.
J'utilise Visual basic 2010 express.
L'application est multi instance (sinon ça sert à rien). Quand un utilisateur envoi un post il s'ajoute simplement à un fichier texte chat.txt.
Les différentes instances de l'application rafraichissent leurs affichages toutes les 5 secondes.
Comme la lecture/écriture se fait dans un seul fichier (situé sur un serveur), j'ai voulu sécuriser en mettant en place un système de jeton artisanal.
Lorsqu'une instance veut écrire, elle attend (pendant pas plus de 6 secondes) la présence d'un fichier jeton.txt sur le serveur.
S'il est présent, l'instance le supprime, réalise son écriture puis le recrée. C'est rustique, je le concède.
Mon code fonctionne pour la première écriture mais pour les autres. J'ai une erreur lors de la tentative de destruction du fichier "Le processus ne peut pas accéder au fichier car il est en cours d'utilisation par un autre processus". Le test est fait en mono instance.
Je dois mal m'y prendre avec la suppression/re-création du fichier Jeton.txt.
Pourriez-vous m'aider svp ? Je suis en plein désespoir !
Ci dessous un code de test qui reproduit parfaitement l'erreur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
StrNomFichier = "E:\Visual Basic\Projet\Test\Test_Fichier\Chat.txt" 'variable globale
strNomJeton = "E:\Visual Basic\Projet\Test\Test_Fichier\Jeton.txt" 'variable globale
End Sub
Private Sub Btn_AddPost_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_AddPost.Click
Dim strPost As String
strPost = "y voilà : " & TimeOfDay
If AttrapeJeton() Then
My.Computer.FileSystem.WriteAllText(StrNomFichier, strPost & vbCrLf, True)
File.Create(strNomJeton)
End If
End Sub
Private Function AttrapeJeton() As Boolean
Dim Count As Integer
Dim Laps As Integer
Count = 0
Laps = 300
While (Not File.Exists(strNomJeton))
Count += 1
Threading.Thread.Sleep(Laps)
If Count > 20 Then
'Attente trop longue
MsgBox("Erreur AttrapeJeton() : Attente trop longue pour le jeton demandé.")
Return False
End If
End While
'Si on arrive ici c'est que le fichier strNomJeton existe
Try
File.Delete(strNomJeton)
Catch ex As Exception
MsgBox("Erreur AttrapeJeton() : le jeton demandéa disparu" & ex.Message)
Return False
End Try
Return True
End Function
Private Sub Btn_Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Quitter.Click
End
End Sub
End Class |