IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment sortir d'une boucle de test vérifiant si un fichier est ouvert ou utilisé ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Comment sortir d'une boucle de test vérifiant si un fichier est ouvert ou utilisé ?
    Bonjour,

    Mon problème est le suivant :

    Appeller la fonction IsOpen pour vérifier si un fichier texte est ouvert ou utilisé, puis faire une boucle de test pour attendre que le fichier texte soit fermé avant de quitter la fonction.

    Donc :

    1/ Appeller la fonction IsOpen pour vérifier si un fichier texte est ouvert ou utilisé =>. Jusque la pas de problème il y a une dizaine de bons exemple sur le site. Comme:
    https://www.developpez.net/forums/d1...d-utilisation/
    https://stackoverflow.com/questions/...-the-text-file

    2/ Il faut que cette fonction attende que le fichier soit fermé par une autre application (un thread sous CMD) => donc il faut réaliser une boucle de test avec tempo pour limiter l'usage inutile du processeur.
    Je ne trouve rien comme exemple même chez les anglo-saxons.
    Donc j'ai écrit la fonction si dessous qui attend bien mais ne sort pas de la boucle une fois le que le fichier texte est fermé ! Le programme se fige. Pour débloquer ctrl + alt +supp ....!!! Pourquoi ?

    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
      Public Function IsOpen(ByVal Filepath As String) As Task(Of Boolean)
     
            'Test si un fichier est déjà ouvert
            Dim inputOk As Boolean = False
            Dim sFichier As String = DISK "\abc.txt"
     
            Do Until inputOk = True
     
                'tempo
                Thread.Sleep(50)
                Try
                    Dim FS As FileStream = File.Open(sFichier, FileMode.Open, FileAccess.Read, FileShare.None)                 ' Ouverture Ok. Si déjà ouvert : referme
     
                    FS.Close()
                    FS.Dispose()
                    FS = Nothing
     
                    'tempo
                    Thread.Sleep(50)
                Catch ex As IO.IOException
                    If TypeOf ex Is IOException Then inputOk = False Else inputOk = True
                End Try
     
            Loop
     
        End Function
    Je ne comprend pas ou est l'erreur dans cette boucle.

    S'agit-il d'une impossibilité de mettre un IF après un catch ex ?

    Autre idée faut-il faire que la fonction test comme en 1/ puis revenir au programme appelant, tester le retour de ex, si ex true relancer la fonction ?

    Si vous avez une idée je vous remercie d'avance pour votre aide.

    a+

  2. #2
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    La boucle suivante avec using à le même problème :

    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
     
     
      Public Function IsOpen(sFichier As String) As Boolean
          Dim inputOk As Boolean = False
          Dim sFichier As String = DISK "\abc.txt"
     
           Do Until inputOk = True
                   Try
                       Using f As New IO.FileStream(sFichier, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
                       End Using
                   Catch Ex As Exception
                If TypeOf Ex Is IOException Then inputOk = False Else inputOk = True
            End Try
            Loop
     
    End Function

  3. #3
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonsoir,

    Faute de trouver de l'aide, il est vrai que nous sommes de moins en moins nombreux en vb.net. J'ai trouvé une solution qui semble bien fonctionner en m'inspirant d'un vieille article du site de Pearson ! http://cpearson.com/

    Bref j'obtiens ceci qui répond a peu près au cahier des charges: (avec quelques rares plantages : 1 fois sur 20 environ) du style fichier déjà ouvert que je n'explique pas puisque using est supposé les fermer!). J'ai fait des tests en rajoutant des thread.sleep(1000) avec toujours ce problème aléatoire!

    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
     Public Function IsOpen(ByVal sFile As String) As Boolean
            sFile = "E:\abc.txt"
            Dim thisFileInUse As Boolean = False
     
            Do While False 
     
                If System.IO.File.Exists(sFile) Then
                    Try
                        Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
     
                        End Using
                    Catch
                        thisFileInUse = True
                    End Try
                End If
                If thisFileInUse = False Then
                    Exit Do
     
                End If
            Loop 
            Return thisFileInUse
        End Function
    Si j'utilise le code de Pearson avec 'goto' (si, si vous avez bien lu le fameux 'goto' qu'il faut bânir !!!) cela fonctionne nickel !!!

    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
    Public Function IsOpen(ByVal sFile As String) As Boolean
            sFile =  "E:\abc.txt"
            Dim thisFileInUse As Boolean = False
     
    3000:                  If System.IO.File.Exists(sFile) Then
                    Try
                        Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
     
                        End Using
                    Catch
                        thisFileInUse = True
                    End Try
                End If
            If thisFileInUse = True Then
                thisFileInUse = False
                GoTo 3000
            End If
            Return thisFileInUse
        End Function
    Certes ça marche , mais bon ... question style


    Je cherche à expliquer cette faille. Merci pour vos idées.

    A vous lire

  4. #4
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Voici les erreurs qui se produisent :

    Nom : Delegate_cs_introuvable.jpg
Affichages : 287
Taille : 173,9 Ko

    Exception levée*: 'System.IO.IOException' dans mscorlib.dll
    Exception levée*: 'System.IO.IOException' dans mscorlib.dll
    Exception levée*: 'System.IO.IOException' dans mscorlib.dll
    Exception levée*: 'System.IO.IOException' dans mscorlib.dll
    Le thread 0x2c78 s'est arrêté avec le code 0 (0x0).
    Le thread 0x2e58 s'est arrêté avec le code 0 (0x0).
    Exception levée*: 'System.IO.IOException' dans mscorlib.dll
    Exception levée*: 'System.Reflection.TargetInvocationException' dans mscorlib.dll
    Le thread 0x2ed8 s'est arrêté avec le code 0 (0x0).
    Une exception non gérée du type 'System.Reflection.TargetInvocationException' s'est produite dans mscorlib.dll
    Une exception a été levée par la cible d'un appel.

    Exception non géré :

    System.Reflection.TargetInvocationException*: 'Une exception a été levée par la cible d'un appel.'
    Exception interne
    IOException*: Le processus ne peut pas accéder au fichier 'E:\sbwin\hnout.txt', car il est en cours d'utilisation par un autre processus.

    Cette exception a été levée à l'origine dans cette pile des appels*:
    System.IO.__Error.WinIOError(int, string) dans __error.cs
    System.IO.FileStream.Init(string, System.IO.FileMode, System.IO.FileAccess, int, bool, System.IO.FileShare, int, System.IO.FileOptions, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES, string, bool, bool, bool) dans filestream.cs
    System.IO.FileStream.FileStream(string, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, int, System.IO.FileOptions, string, bool, bool, bool) dans filestream.cs
    System.IO.StreamWriter.CreateFile(string, bool, bool) dans streamwriter.cs
    System.IO.StreamWriter.StreamWriter(string, bool, System.Text.Encoding, int, bool) dans streamwriter.cs
    System.IO.StreamWriter.StreamWriter(string, bool) dans streamwriter.cs
    System.IO.File.CreateText(string) dans file.cs
    SBWIN2020.Form1.ModuleResolutionPopeye() dans Form1.vb
    System.Runtime.CompilerServices.AsyncMethodBuilderCore.ThrowAsync.AnonymousMethod__6_0(object) dans AsyncMethodBuilder.cs



    Il semble qu'il manque delegate.cs d'après le tableau d'affichage quand le programme fini la boucle. Voir copie écran ci-joint.

    Comment trouver delegate.cs ?

  5. #5
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    EPILOGUE !

    Quand apparait ce genre de message que je ne comprend pas faute d'un mode d'emploi efficace ! Merci Microsoft au passage.

    Mais grâce à ma longue expérience : Il y a de forte chance que le système soit instable car il n'y a a pas d'erreur de code, sauf si quelqu'un me démontre l'inverse ?!

    Et oui il y a un très bon article sur Wix sur les problèmes liés aux mauvaises versions de mscorlib.dll ou sa disparition pure et simple des écrans !

    Après l'avoir réinstallé sur SYSWOW64 rien n'a changé. J'ai donc pris les grands moyens en réinstallant les modules de Visual 2019.

    Depuis le système est stable et il n'y a plus de problème même avec 'do loop' et using.

    Vive l'instabilité des systèmes ou des mises à jours automatiques imparfaites.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    wow
    tes différentes versions de code ont toute à peu près le même problème, ton histoire avec delegate.cs c'est juste pour débugger le code du framework et il te dit juste que tu n'as pas le code source du framework sur ta machine donc fausse piste
    quant à réinstaller divers trucs il n'y a pas d'utilité car c'est juste ton code qui est faux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while true
      try
        using fs .. ' teste si le fichier est ouvert
        end using 
        exit while ' sort de la boucle, ca peut se faire avec une variable comme tu avais tenté, mais tu ne settait pas la variable ...
      catch ex as exception
         thread.sleep(100)
      end try
    end while


    code #1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Catch ex As IO.IOException
                    If TypeOf ex Is IOException Then inputOk = False Else inputOk = True

    ici, tu testes si ex est de type IOException, or vu que tu as écris ex As IO.IOException, ex est forcément de type IOException au moment où tu le testes (seul ce type d'exception est d'ailleurs interceptées, les autres crasheront chez l'appelant ... pas top)
    de plus inputok est à mettre à true si le fichier est ouvert, donc absolument pas dans le catch qui signifie que l'ouverture à planter ... donc double bug


    code #2
    pareil, tu set le flag dans le catch, ca ne peut donc pas fonctionner


    etc...


    goto n'est pas forcément à proscrire, à outrance il peut rendre le code illisible, et il y a souvent mieux à faire
    une fois compilé du code n'en comportant pas peut se retrouver avec des goto générés par le compilateur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Debug - comment sortir d'une boucle
    Par mafanta dans le forum Eclipse Java
    Réponses: 16
    Dernier message: 19/12/2011, 15h26
  2. Réponses: 4
    Dernier message: 26/11/2011, 12h42
  3. [PHP 5.3] Comment sortir d'une boucle for en PHP ?
    Par beegees dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2009, 20h36
  4. comment sortir d'une boucle while d'un Iterator
    Par solawe dans le forum Langage
    Réponses: 6
    Dernier message: 18/03/2008, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo