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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager