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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
Imports System.Threading
''' <summary>
''' Enumération contenant la liste des fichiers suceptible d'être vérifié dans le logiciel
''' </summary>
''' <remarks></remarks>
Enum CheckFile
Operation
End Enum
Friend Class CheckFileModify
#Region "Gestion de l'événement"
''' <summary>
''' Lancement de l'événement
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Delegate Sub FileModifyEventHandler(ByVal sender As Object, ByVal e As ModifyFileEventArgs)
Public Event OnFileModify As FileModifyEventHandler
Private Sub FileModified(ByVal Chemin As String, ByVal Type As CheckFile)
Dim e As ModifyFileEventArgs = New ModifyFileEventArgs(Chemin, Type)
If Not (e Is Nothing) Then
RaiseEvent OnFileModify(Me, e)
End If
End Sub
#End Region
''' <summary>
''' Thread qui va vérifier régulièrement si le fichier a été modifié
''' </summary>
''' <remarks></remarks>
Private _threadCheck As Thread
''' <summary>
''' Classe qui permet de passer des données au thread ci-dessus
''' </summary>
''' <remarks></remarks>
Private Class ThreadCheck
''' <summary>
''' Le chemin de mon fichier
''' </summary>
''' <remarks></remarks>
Private sChemin As String
''' <summary>
''' Le type du fichier
''' </summary>
''' <remarks>Dans un autre projet que le mien cela est très certainement inutile</remarks>
Private eType As CheckFile
Private fiFile As IO.FileInfo
''' <summary>
''' La date de dernière modification
''' </summary>
''' <remarks></remarks>
Private LastDate As Date
''' <summary>
''' L'objet parent. (Celui qui à lancé le thread)
''' </summary>
''' <remarks>Il est utilisé pour déclencher l'événement</remarks>
Private Parent As CheckFileModify
''' <summary>
''' Un booléen qui me permet de savoir si je doit arrêter de vérifier la mise à jour du fichier
''' </summary>
''' <remarks></remarks>
Private boolEnd As Boolean
''' <summary>
''' Méthode qui indique à l'objet d'arrêter de surveiller le fichier
''' Cela permettra au thread de sortir de sa boucle infinie et de s'arrêter proprement
''' </summary>
''' <remarks></remarks>
Friend Sub Terminer()
Me.boolEnd = False
End Sub
''' <summary>
''' Constructeur de mon objet.
''' </summary>
''' <param name="Chemin">Chemin de mon fichier</param>
''' <param name="Type">Type de mon fichier (probablement inutile dans un autre projet</param>
''' <param name="Parent">L'objet parent à celui-ci pour lui dire de déclencher l'événement qui indiquera au reste du monde (:p) que le fichier a été modifié</param>
''' <remarks></remarks>
Public Sub New(ByVal Chemin As String, ByVal Type As CheckFile, ByVal Parent As CheckFileModify)
Me.sChemin = Chemin
Me.eType = Type
Me.Parent = Parent
Me.boolEnd = True
End Sub
''' <summary>
''' Fonction du thread
''' </summary>
''' <remarks></remarks>
Public Sub ThrFunc()
fiFile = New IO.FileInfo(sChemin)
'On récupére la date de dernière modification du fichier
LastDate = fiFile.LastWriteTimeUtc
'Tant qu'on ne lui a pas dit de s'arrêter le thread continu.
While Me.boolEnd
'On fait dormir le thread 2 secondes
Thread.Sleep(2000)
'On est obligé de recréer l'objet fiFile. L'appel de LastWriteTimeUtc ne va pas chercher la valeur dans le descripteur de fichier mais celle en mémoire dans l'objet...
fiFile = New IO.FileInfo(sChemin)
'Si la date actuellement indiqué sur le fichier est différente de celle sauvegardé la première fois on déclenche l'événement
If fiFile.LastWriteTimeUtc <> LastDate Then
Me.Parent.FileModified(Me.sChemin, Me.eType)
'On sors de la boucle, le thread va s'arrêter
Exit While
End If
End While
End Sub
End Class
''' <summary>
''' Objet de la classe ci-dessus.
''' Il sert à transmettre des données au thread
''' </summary>
''' <remarks></remarks>
Private myThreadObj As ThreadCheck
''' <summary>
''' On lance le thread
''' </summary>
''' <param name="Chemin">Chemin du fichier à surveiller</param>
''' <param name="Type">Type de mon fichier (probablement inutile dans un autre projet</param>
''' <remarks></remarks>
Public Sub StartThread(ByVal Chemin As String, ByVal Type As CheckFile)
myThreadObj = New ThreadCheck(Chemin, Type, Me)
_threadCheck = New Thread(AddressOf myThreadObj.ThrFunc)
_threadCheck.Name = "ThreadCheck"
_threadCheck.Start()
End Sub
''' <summary>
''' Pour arrêter de surveiller le fichier
''' </summary>
''' <remarks></remarks>
Public Sub EndThread()
Me.myThreadObj.Terminer()
End Sub
End Class |
Partager