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