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

C# Discussion :

Détecter d'où provient le Console.In


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Détecter d'où provient le Console.In
    Bonjour à tous.

    C'est mon premier poste ici, alors j'en profite pour tous vous saluer.

    Afin de me perfectionner un peu en C#, je voudrais écrire un clone de l'outil Unix "grep".
    http://pwet.fr/man/linux/commandes/grep

    J'ai commencé à coder, et tout va bien, il fonctionne à merveille.

    Seulement, en ligne de commande, on peut avoir plusieurs sources pour le System.In
    1/ Si on ne fait rien de spécial, c'est le clavier
    2/ Si on indique un paramètre : "grep test 0<c:\in\texte.txt" c'est alors le fichier "c:\in\texte.txt" qui est utilisé à la place du clavier
    3/ Si on utilise le pipe après une autre commande, c'est la sortie de la commande précédente : "dir *.* | grep test"

    Tout ça, c'est bien joli.
    Le grep fonctionne en général avec le |, mais il est impossible d'être sûr que l'utilisateur va toujours utiliser ce système, et ne va pas l'utiliser sans paramètre et taper au clavier (pour tester les paramètres par exemple).

    Dans ce cas, ma boucle se termine à la première ligne saisie. Moi, je voudrais que ça continue à accepter des lignes jusqu'à ce que l'utilisateur frappe une certaine séquence (ctrl+c par exemple).

    Voici mon code :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
            static void Main(string[] args)
            {
                GrepArguments Args = new GrepArguments(args);
     
                int Count = 0;
     
                if (Args.Motif.Length == 0)
                {
                    Console.Error.WriteLine("Une erreur s'est produite : vous n'avez pas spécifié de critère de recherche.");
                    Environment.ExitCode = 1;
                    return;
                }
     
    /*...*/
                while (Console.In.Peek() > -1) // Ici mon test est false quand je suis en mode "clavier" et que j'ai tapé ma première ligne
                {
                    string line = Console.In.ReadLine();
     
                    StringComparison sc;
                    if (Args.IgnoreCase)
                    {
                        sc = StringComparison.CurrentCultureIgnoreCase;
                    }
                    else
                    {
                        sc = StringComparison.CurrentCulture;
                    }
     
                    int indexOf = line.IndexOf(Args.Motif, sc);
     
                    if (
                        (!Args.InvertMatch && indexOf > -1)
                        ||
                        (Args.InvertMatch && indexOf == -1)
                        )
                    {
                        Count++;
                        if (!Args.Count)
                        {
                            if (!Args.DisplayOnlyMatching)
                            {
                                Console.Out.WriteLine(line);
                            }
                            else
                            {
                                Console.Out.WriteLine(line.Substring(indexOf, Args.Motif.Length));
                            }
                        }
                    }
                }
     
                if (Args.Count)
                {
                    Console.Out.WriteLine(Count.ToString());
                }
     
                Environment.ExitCode = 0;
            }
    Une idée pour détecter proprement si je suis en mode console ?

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour le problème de la boucle qui s'arrête après la première itération, c'est résolu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((line = Console.In.ReadLine()) != null)
    En revanche, j'ai toujours le souci de détecter si mon Console.In est le clavier, un fichier ou le résultat d'une commande.

    En effet, dans les deux derniers cas, il faut que je le traite jusqu'à la fin du traitement.
    Mais dans le premier cas, il faut que je puisse m'arrêter lorsque je détecte une séquence clavier particulière (par exemple une ligne constituée que de "."), sinon au clavier je ne peux plus m'arrêter autrement que par Ctrl+C, ce qui me plaît moyen.

    Une idée ?

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Un break dans ton while si line contient la sequence attendue !

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    C'est insuffisant, dans la mesure où le fichier en entrée ou la commande en entrée peut contenir sur une ligne la séquence d'arrêt.

    Du coup, j'ai vraiment besoin de détecter si le programme s'exécute en mode inter-actif, ou s'il traite un flux d'entrée sans tenir compte des actions de l'utilisateur...

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    J'ai bien un début de solution, mais c'est trop crade pour moi...

    En effet, si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Console.KeyAvailable) {}
    Ben si je suis en mode "saisie au clavier", ça plante pas, et ça fait rien...

    Mais si le System.In correspond à un fichier en entrée ou la réponse d'une autre commande, ça lève cette exception :

    Exception non gérée*: System.InvalidOperationException: Impossible de voir si un
    e touche a été pressée lorsque l'application ne possède pas de console ou lorsqu
    e l'entrée sur la console a été redirigée à partir d'un fichier. Essayez Console
    .In.Peek.
    à System.Console.get_KeyAvailable()
    à grep.Program.Main(String[] args) dans C:\Users\Informatique1\Documents\Visu
    al Studio 2008\Projects\Unix Tools\grep\Program.cs:ligne 14
    Bon, super, je peux, à l'aide d'un try{} tout pourri, détecter si je suis en mode clavier ou pas...

    Mais y'a pas moyen de faire ça proprement ?

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    J'ai cherché un peu, mais j'ai bien peur que ce soit la seule solution
    Pour detecter si un fichier est accessible c'est hélas le meme cirque

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Détecter couleur de fond de la console
    Par jojpa54 dans le forum Free Pascal
    Réponses: 1
    Dernier message: 15/07/2009, 22h45
  2. Détecter Windows 2000 Professionnel
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/11/2006, 23h02
  3. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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