10
votes

Comment puis-je détecter lorsque la sortie est redirigée?

J'ai une application Win32 écrite en C qui peut avoir sa sortie de console via printf () redirigé vers un fichier journal.

Ce serait bien si je pouvais avoir mon application. Détecter s'il avait été démarré avec ou sans redirection '>'.

Des idées?


6 commentaires

Afaik, ce n'est pas possible. Je vais donc lire ceci pour voir si je me trompe ...


Aucun moyen de savoir. J'ai vu des programmes qui permettent une option de ligne de commande de faire différentes fonctionnalités qui sont souvent activées lorsque la sortie est redirigée.


Pas sûr à 100% sous Windows, mais à Linux, de nombreux programmes qui se comportent différemment si vous ... L'exemple le plus courant est "LS".


Merci Fortran, j'ai oublié de dire que je codérise pour Windows.


Duplicatural possible de Comment vérifier si mon application de console Delphi est redirigée vers un fichier ou un tuyau?


@fortran: En fait, le programme "LS" de gnuwin32 fait se comporte différemment si cela vous convient tout comme il fait sous Linux, il y a donc définitivement un moyen d'obtenir ce comportement.


5 Réponses :


0
votes

afaik la réponse à ceci est que vous ne pouvez pas. La redirection de sortie fonctionne simplement en lisant simplement le flux de sortie à partir d'un programme donné et en la redirigeant à un autre tuyau / flux. La conception des fichiers / flux est telle que l'auteur ignore le lecteur au point que vous ne devriez pas savoir que vous êtes en train de lire.

Détecter même qu'il y avait un lecteur n'aurait aucune utilité car il y en a un dans le cas normal. La console lit la sortie de votre programme et l'affiche déjà à l'écran.


0 commentaires

2
votes

Je pense que les tuyaux sont aveugles par nature, de sorte que vous n'avez pas de manière intégrée pour savoir si vous êtes redirigé. De plus, essayant de découvrir ce qui se passe derrière une couche d'abstraction est une mauvaise habitude.

Si vous avez vraiment besoin de contrôler votre sortie, ajoutez le nom du fichier journal sous forme de paramètre de ligne de commande!

Cela étant dit, vous pouvez faire des devinières intelligentes pour savoir:

  • Un programme peut interroger l'historique des commandes Shell pour connaître les commandes les plus récentes exécutées.
  • Si vous connaissez le chemin d'accès aux logfiles, vous pouvez numériser ce répertoire et voir si un fichier a été créé ou modifié sa taille.
  • Benchmark de la vitesse d'écriture lorsque redirigé et non redirigé. Cela ne fonctionnerait que si votre système est ultra-stable et que l'état de l'environnement ne changera pas.

0 commentaires


5
votes

Tom, merci pour l'entrée.

J'ai fait des expériences et j'ai trouvé ces œuvres pour moi .. xxx

lorsque la sortie d'une application est redirigée vers un fichier , fgetPos () définit "POS" à zéro. Cela a du sens depuis sa fraîchement ouvert Sterr pour vous. EDIT: En réalité, la valeur renvoyée peut être un entier positif si le texte a déjà été redirigé vers le journal / fichier. Donc, dans votre code, vous auriez quelque chose comme "si (pos> = 0) bfredraré = true;"

Lorsque la sortie d'une application n'est pas redirigée - il va sur le périphérique de la console - pas un fichier, Donc, FgetPos () définira «POS» à -1.


0 commentaires

1
votes

Méthode de Microsoft: WriteConsole échoue s'il est utilisé avec une poignée standard qui est redirigée vers un fichier. Si une application traite une sortie multilingue pouvant être redirigée, déterminez si la poignée de sortie est une poignée de console (une méthode consiste à appeler le getconsolemode fonctionne et vérifiez si cela réussit).


0 commentaires