Fonction IsOpen est-elle bien adaptée ?
Bonjour,
Ma feuille de route :
Vérifier si un fichier TEXTE.txt et/ou un fichier ABC.exe ne sont pas utilisé ou en service.
La fonction IsOpen est appelé en boucle chaque fois que ABC.exe fini son travail. Le temps d'une boucle peut aller d'une demi seconde à plusieurs heures. Le test de l'exe et de txt n'ai pas simultanée.
La routine que j'ai écrit ci-dessous fonctionne mais retourne souvent l'erreur fichier TEXTE.txt déjà ouvert. Pour éviter (phase test) ce problème j'ai mis Catch Exception avec aucune action.
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
|
Public Sub FinModReso()
'Test si le fichier TEXTE.txt et ABC.exe sont toujours ouvert. Si oui attendre.
Call IsOpen(Disk + "TEXTE.txt")
Thread.Sleep(100)
' Lit le fichier "TEXTE.txt" créé par ABC.exe
Dim monStreamReader2 As StreamReader
monStreamReader2 = New StreamReader(Disk + "TEXTE.txt")
LecturemonStreamReader2 = monStreamReader2.ReadLine() '+ vbNewLine
End sub
Public Function IsOpen(ByVal sFile As String) As Boolean
Message = ""
sFile = Disk + "TEXTE.txt"
Dim thisFileInUse As Boolean = False
Dim p() As Process
3000: 'test si sFile est ouvert
If System.IO.File.Exists(sFile) Then
Try
Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
If FileMode.Open = True Then
thisFileInUse = True
Else thisFileInUse = False
End If
End Using
Catch ex As Exception
'La suite entre '' n'est pas à uiliser car génère un arrêt du process pour problème long puisque erreur de lecture TEXTE.txt déjà ouvert
'MessageBox.Show(ex.Message, "Description de l'erreur" & vbNewLine &
' "ex.Message: " & ex.Message & vbNewLine &
' "ex.StackTrace: " & ex.StackTrace)
End Try
End If
'Recherche l'état du thread (ici un .exe) en cours d'execution si p.count > 0
p = Process.GetProcessesByName("ABC")
If thisFileInUse = True Or p.Count > 0 Then
thisFileInUse = False
GoTo 3000
End If
Return thisFileInUse
End Function |
Il est claire que cette routine a un problème, mais je ne vois pas comment écrire une boucle d'attente de non utilisation simultanée d'un exe et d'un texte ! Le goto n'est pas l'essentiel pour résoudre le problème, mais bon si on peut le remplacer.
Avec async et delegate ?
Si vous avez une idée je suis preneur.
Merci d'avance