10
votes

Vérifiez si la sortie est redirigée

J'ai une application de console écrite en C # qui traite certaines données puis imprime les résultats. Jusqu'à ce que les résultats soient disponibles, il existe une petite animation (/ - \ |) et le pourcentage d'avancement (XX%) qui met constamment à jour.

Évidemment, si l'utilisateur redirige la sortie de mon application, il sera imprimé sur le fichier texte où la sortie est redirigée. Si possible, je voudrais éviter cela.

Voilà donc un moyen de détecter si la sortie de mon application est redirigée? Je ne considère que montrer que les indicateurs de progrès lorsqu'ils sont gérés avec un paramètre spécifié, mais j'espère que quelqu'un aura une bonne réponse pour moi.


2 commentaires

Son intéressant de lire votre question trois ans plus tard et réalisant à quel point c'était idiot :-) S'il y a quelqu'un qui lisait ceci ... La bonne façon d'approcher ceci est certainement certainement pour ne pas afficher la barre de progression par défaut ... ne l'affiche que lorsque Un commutateur spécifique est utilisé.


duplicache possible de Comment puis-je Déterminez si la console.out a été redirigée vers un fichier?


7 Réponses :


3
votes

Vous ne pouvez pas. La sortie redirigée est totalement et entièrement en dehors du cadre du programme d'exécution. Vous peut Ajoutez une option CommandLine pour désactiver votre jolie sortie afin qu'elle puisse être utilisée également.

edit: vous pouvez (maintenant) ... avec .NET 4.5 à partir (voir Matt Brooks 'Matt Brooks' Réponse ).


3 commentaires

Tout comme je pensais>.


Et si je veux deviner certains paramètres par défaut selon que l'entrée passe de la console ou non? Par exemple, dans SQL Parser, il est bon d'imprimer le jeu d'enregistrements résultant lors de l'acceptation des commandes du clavier, mais soyez silencieux lors de l'analyse de dossier. Ou si je me soucie de générer la nomenclature Unicode lorsque vous écrivez dans le fichier? Quels sont les modèles qui doivent être utilisés dans ces cas?


@HIMELFLA: Si vous voulez gérer des trucs comme écrire un bom, demandez un paramètre de sortie. Selon le système d'exploitation, vous pouvez détecter si vous exécutez sur une console, mais il est convolué pour dire le moins, et cela ne fonctionne pas sur Windows / C # Je ne pense pas. Votre pari le plus simple est d'accepter un -q (silencieux) ou une option similaire ou supposez-vous que vous obtenez une entrée programmée si vous avez ladite option active d'écrire dans un fichier.



3
votes

Plutôt que d'essayer de déterminer si le contenu est redirigé ou non, j'utiliserais console.writeline (ou console.out.writeline) pour imprimer vos résultats et console.error.write pour vos mises à jour d'état. La sortie d'écran affichera correctement mais ne pas être reflétée dans le fichier texte.


2 commentaires

Bonne idée, mais il est plutôt trompeur d'écrire des données non erronées à STDERR.


Trompeur, oui, mais une pratique courante tout de même.



5
votes

Vous pouvez utiliser la méthode native getconsolemode Pour voir si stdout va à une console ou non.

Cette méthode est suggérée par les remarques de la documentation de WriteConsole :

... Déterminez si la poignée de sortie est une poignée de la console (une méthode consiste à appeler la fonction getconsolemode et à vérifier si elle réussit) ...


2 commentaires

Grannié, cela signifie utiliser des méthodes natives dangereuses ... mais c'est possible.


Certaines propriétés appellent getconsolemode et jetez une défaillance, telle que console.cursorvisible . Cela permettrait de vérifier la sortie de la console sans utiliser p / invoke.



7
votes

Comme il s'avère, il sera bientôt disponible à la manière élégante et inter-plate-forme: lien . < / p>


0 commentaires

2
votes

Probablement, vous pouvez essayer ceci: xxx

si la sortie standard n'est pas redirigée, la sortie du getFileType () doit être 0x0002. Cela fonctionne pour moi. :)


0 commentaires

0
votes

console.write ("quoi que ce soit") (and writeine) rédigez-vous des données sur le flux derrière console.out . Pour toujours afficher une barre de progression sur la console et ne pas l'écrire dans un fichier, si la sortie est redirigée vers un fichier ou non, utilisez plutôt le flux d'erreur:

console.error.write ("<");

Lorsqu'une application redirige la sortie avec l'opérateur> Opérateur ( dir c: \ *. *> Plus ), seule console.out est redirigé et non la console .Error


0 commentaires

13
votes

de .NET Framework 4.5 En cours, vous pouvez utiliser le CONSOLE.ISOutUtPutRecTRecTReck Propriété pour détecter cela.

Il y a aussi console.IsErrorredirected .


0 commentaires