7
votes

Comment vérifier si un rationniste est toujours ouvert?

J'essaie de "envelopper" un streamreader dans une classe Fichier , avec des méthodes et des attributs supplémentaires.

Je veux deux choses: < ul>

  • Le streamreader s'ouvre automatiquement dans le Fichier Classe;
  • Le StreamReder s'ouvre lorsque nous utilisons la méthode excédentaire readline , et non auparavant (nous devons modifier le fichier avant de le lire avec un StreamReader ).

    Un morceau de mon code ressemble à ceci: xxx

    au ??? , je veux vérifier si le streamerader a été fermé. En effet, si nous faisons: xxx

    sr n'est pas null, mais comment vérifier qu'il est fermé et comment le réexprimer?

    Si vous vous demandez pourquoi j'ai besoin d'ouvrir et de fermer StreamReader , c'est parce que l'objet fichier doit exister à tout moment, mais le fichier qu'il représente doit être modifié plusieurs fois dans un programme externe.

  • c#

    4 commentaires

    Le fichier system.io a une classe nommée fichier alors faites attention à ne pas mélanger votre propre classe et le System.IO.File classe .


    .basestream.Canread Peut-être, bien que expirement disposé / null serait mieux.


    Je suis français, alors ma classe est "Fichier". Je vais éditer cela, je voulais être complet mais j'ai fait le contraire.


    Vous ne devriez pas concevoir un wrapper filtream qui peut fermer et rouvrir son flux. Gardez-le plus simple. Ceci est probablement un problème xy.


    4 Réponses :


    2
    votes

    Il n'y a pas de moyen publié de vérifier si le flux / lecteur est fermé. Il suffit de définir lecteur à NULL dès que vous la fermez: xxx

    ou conserver un drapeau séparé.


    1 commentaires

    Je n'avais pas ce que même c'est simple. Merci.



    10
    votes

    La chose la plus facile est de Dispose (vous devez vraiment le faire, il ferme également le flux) et la définir sur null lorsque vous le fermez.

    éventuellement, vous pouvez rechercher endofstream , mais cela nécessite que vous lisez à la fin du flux.


    2 commentaires

    Bonne idée; Je vous remercie. Pourquoi devrais-je préférer Disposer sur Fermer ? (selon ce sujet, fermeture appels Dispose : Stackoverflow.com/Questtions/7524903/... )


    @Chostakovitch: Les opinions varient, mais mon opinion est la suivante: si elle implémente Idisposable , appelez Dispose . C'est une preuve future aussi, car lorsque Microsoft le met à jour et qu'il nécessite une élimination, vous êtes en sécurité.



    4
    votes

    Il suffit de définir la référence à NULL lorsque vous fermez le lecteur:

    sr.Close();
    sr = null;
    


    0 commentaires

    2
    votes

    streamreader.close () fera un certain nombre de choses si le drapeau céder est défini sur false , si tel est le cas alors Vous pouvez vérifier si streamreader.basestream est null . xxx

    sorties:

    faux

    vrai

    Appuyez sur n'importe quelle touche pour continuer. . .


    1 commentaires

    Idée intéressante. Je ne pense pas que ce comportement soit documenté, il serait donc préférable de ne pas compter sur elle. En effet, si on n'a aucun contrôle lorsque le lecteur est disposé, cela peut être une option. En outre, en utilisant StreamReader Propriété spécifique limitera les options pour utiliser d'autres lecteurs à la place (I.e. Base Textreader ).