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

Contribuez .NET Discussion :

[C#] Comment décoder le Diagnostics.Process.StandardOutput [FAQ]


Sujet :

Contribuez .NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut [C#] Comment décoder le Diagnostics.Process.StandardOutput
    Salut � tous,

    J'utilise la classe System.Diagnostics.Process pour lancer des commande DOS et r�cup�rer le r�sultat pour en faire un traitement. J'ai des petits soucis parfois avec des caract�re qui sont un peu mal d�cod�. Par exemple, pour la commande DIR, voil� ce que je r�cup�re dans System.Diagnostics.Process.StandardOutput

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Le volume dans le lecteur D s'appelle DATA
     Le num‚ro de s‚rie du volume est 801B-4CC2
     
     R‚pertoire de D:\Programmes
     
    17/06/2005  20:16    <REP>          .
    17/06/2005  20:16    <REP>          ..
    22/09/1998  15:46             1ÿ942 environ.ksh
    22/09/1998  15:46             1ÿ323 profile.ksh
     
                   2 fichier(s)            3ÿ265 octets
                  35 R‚p(s)     955ÿ125ÿ760 octets libres
    Autant dire qu'il y a comme un soucis avec certains caract�res. Y a-t-il un traitement � faire sur le StreamReader pour r�cup�rer une sortie Unicode ? Si quelqu'un a une id�e, je suis preneur.
    Merci pour votre aide.

    CrashMan

  2. #2
    Expert confirm�
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    D�tails du profil
    Informations personnelles :
    �ge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par d�faut
    oui le flux doit avoir un encodage de lecture �quivalent � l'encodage d'ecriture
    essayes d'utiliser le constructeur qui permet de surcharger un encodage par exemple System.Text.Encoding.Default je crois (il y en a d'autres...)

  3. #3
    R�dacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par d�faut
    En effet, dans le constructeur, utilises System.Text.Encoding.Default comme 2�me param�tre

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut
    Merci pour votre aide, mais je ne vois pas comment changer l'encodage du flux de sortie. Moi je lis directement la property StandardOutput de System.Diagnostics.Process apr�s avoir fait le Run. Je n'ai pas trouv� de constructeurs de Diagnostics.Process qui prennent des Arguments. Et la property Diagnostics.Process.StandardOutput.CurrentEncoding n'est qu'en lecture seule. Je dois pas �tre tr�s dou�, mais je ne vois pas comment exploiter vos infos. Vous pouvez pr�ciser, avec un exemple si possible ?
    Merci

    CrashMan

  5. #5
    R�dacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par d�faut
    Montre nous le code que tu utilises

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut
    Voil� un extrait de mon code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    System.Diagnostics.Process runCmd = new System.Diagnostics.Process();
    runCmd.StartInfo.FileName = @"C:\WINDOWS\system32\cmd.exe";
    runCmd.StartInfo.Arguments="dir";
    runCmd.StartInfo.RedirectStandardOutput = true;
    runCmd.Start(); 
    string output = runCmd.StandardOutput.ReadToEnd();
    CrashMan

  7. #7
    R�dacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par d�faut
    Arf oui, la c'est vrai que ca va etre dur, on peut rien pass� au constructeur

  8. #8
    Expert confirm�
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    D�tails du profil
    Informations personnelles :
    �ge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par d�faut
    sauf peut-�tre si tu r�cup�re le resultat de runcmd dans un streamreader qui lui poss�de le constructeur voulu
    apr�s je ne sais pas o� tu veux l'afficher

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut
    Merci pour les remarques, mais �a ne marche toujours pas. J'ai essay� le truc suivant :

    System.IO.StreamReader TraceCmdReader = new System.IO.StreamReader(runCmd.StandardOutput.BaseStream,System.Text.Encoding.Default);
    J'ai essay� avec les encodages ASII, Unicode, UTF7 et UTF8. Les r�sultats sont diff�rents, mais toujours aussi d�cevant. Vous n'avez pas une autre id�e en magasin ?

    CrashMan

  10. #10
    Expert confirm�
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    D�tails du profil
    Informations personnelles :
    �ge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par d�faut
    Excuses si tu as d�j� r�pondu � la question mais que renvoie en test la propri�t�
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    runCmd.StandardOutput.CurrentEncoding;
    merci

  11. #11
    R�dacteur
    Avatar de abelman
    Inscrit en
    F�vrier 2003
    Messages
    1 106
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2003
    Messages : 1 106
    Par d�faut
    Les sorties consoles DOS sont en OEM-defined character set

    pour les transformer en ANSI : Api win32 OemToChar ou OemToCharBuff

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut
    G�nial Abelman, �a marche nikel. Par contre j'ai encore 2 petites questions :

    1- Est ce qu'il y a un autre moyen de faire �a sans invoquer une DLL native win32 ? J'aurais aim� rester 100% C# dans une optique de porter le code sur UNIX avec Mono (� moins que le probl�me de l'encodage OEM ne se rencontre que sous DOS !!!)

    2- J'ai r�ussi en Invoquant la m�thode OemToCharBuff:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    uint Taille = 5000;
    StringBuilder strBuilder = new StringBuilder((int)Taille);
    bool res = OemToCharBuff(runCmd.StandardOutput.ReadToEnd(),strBuilder,Taille);
    Je n'ai pas r�ussit a utiliser OemToChar:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    StringBuilder strBuilder = new StringBuilder();
    bool res = OemToChar(runCmd.StandardOutput.ReadToEnd(),strBuilder);
    J'ai l'exception System.ExecutionEngineException � l'ex�cution. Pour ma culture g�n�rale et parceque �a m'ennuie d'avoir � d�finir la taille de ma StringBuilder, quelqu'un saurait -il pourquoi �a cloche ?
    Encore mille merci pour votre aide.

    CrashMan.

  13. #13
    Expert confirm�
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    D�tails du profil
    Informations personnelles :
    �ge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par d�faut
    dixit MSDN
    Notes
    Les erreurs de moteur d'ex�cution sont des erreurs irr�cup�rables qui ne doivent jamais se produire. Ces erreurs se produisent essentiellement lorsque le moteur d'ex�cution est endommag� ou lorsque des donn�es manquent. Le syst�me peut lever cette exception � tout moment. Lorsque cela est possible, le syst�me l�ve une exception qui fournit davantage d'informations que l'exception ExecutionEngineException.

    Les applications ne doivent pas lever ExecutionEngineException.

    ExecutionEngineException utilise le HRESULT COR_E_EXECUTIONENGINE dont la valeur est 0x80131506.

    Pour obtenir la liste des valeurs initiales des propri�t�s d'une instance de ExecutionEngineException, consultez les constructeurs ExecutionEngineException.

  14. #14
    R�dacteur
    Avatar de abelman
    Inscrit en
    F�vrier 2003
    Messages
    1 106
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2003
    Messages : 1 106
    Par d�faut
    Citation Envoy� par CrashMan
    1- Est ce qu'il y a un autre moyen de faire �a sans invoquer une DLL native win32 ? J'aurais aim� rester 100% C# dans une optique de porter le code sur UNIX avec Mono (� moins que le probl�me de l'encodage OEM ne se rencontre que sous DOS !!!)
    Je ne sais pas ... Je programme pas sous Unix. J'avais cherch� � l'epoque � le faire 100% .NET mais je n'y �tais pas arriv�. Je dirais donc que l'on ne peut pas

    Citation Envoy� par CrashMan
    Pour ma culture g�n�rale et parceque �a m'ennuie d'avoir � d�finir la taille de ma StringBuilder, quelqu'un saurait -il pourquoi �a cloche ?
    Encore mille merci pour votre aide.
    CrashMan.
    Tu peux utiliser OemToChar mais il faut que ton StringBuilder soit au moins de la taille de la chaine que tu souhaites convertir. Tu as une exception car le buffer de ton stringbuilder n'est tout simplement pas assez grand.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    6
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Par d�faut
    Effectivement, j'aurais pu y penser. En tout cas merci beaucoup � tout les deux. J'aurais jamais trouv� tout seul. Ce Forum est vraiment tr�s efficace.
    Merci

    CrashMan

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Ouverture de document via System.Diagnostics.Process
    Par Spoonnny dans le forum Windows Forms
    R�ponses: 4
    Dernier message: 09/01/2008, 18h24
  2. System.Diagnostics.Process.GetProcesses Acc�s refus�
    Par Courgette17 dans le forum VB.NET
    R�ponses: 6
    Dernier message: 03/07/2007, 10h11
  3. R�ponses: 2
    Dernier message: 31/05/2007, 13h37
  4. Comment d�tecter une erreur dans un process
    Par chuckboy dans le forum MFC
    R�ponses: 3
    Dernier message: 25/10/2005, 10h40
  5. R�ponses: 2
    Dernier message: 30/01/2004, 14h07

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