2010-12-13 95 views
3

Je souhaite lancer une application externe et capturer sa sortie. C'est assez facile, en utilisant Diagnostics.Process et son OutputStream.Comment capturer une sortie de processus binaire en C# /. NET

Cependant, le processus que j'ai généré données binaires, que je dois saisir comme Stream, non pas comme le texte StreamWriter

Son là un moyen d'obtenir le flux binaire brut sous-jacent?

Actuellement, je le pirater en lançant un fichier batch qui ressemble à:

myapplication | socat stdin tcp-connect:localhost:12345

Et dans mon code créer et écouter sur un socket TCP. alors que ce hack fonctionne, c'est un peu moche, et je préfère utiliser le processus externe directement.

(Une chose que je ne peux pas faire est d'utiliser des fichiers locaux, comme les données en temps réel dans sa nature)

Répondre

1

Vous pouvez utiliser un tube nommé, similaire mais plus en profondeur que la Fonctionnalité OutputStream de Process (qui est essentiellement un écouteur pour StandardOutput). Les canaux nommés sont accessibles à l'aide de Streams, sans aucune supposition quant au contenu des données de caractères Unicode. Ils n'attachent pas non plus les ports réseau, à moins que vous ne souhaitiez vous connecter à un canal à distance (ce qui est également possible).

+1

Mais vous devez modifier le processus fils pour qu'il utilise le canal, ou bien p/invoquer 'CreateProcess' pour passer le canal comme le handle de sortie standard de l'enfant. –

1

J'utilise le code follwowing pour lire des données binaires à partir stdout d'un programme

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "yourProcess"; 
info.Arguments = "blah"; 
info.StandardOutputEncoding = System.Text.Encoding.GetEncoding("latin1");//important part 
info.RedirectStandardOutput = true; 
info.UseShellExecute = false; 
Process p = Process.Start(info); 
FileStream fs = new FileStream("outputfile.bin", FileMode.Create); 

while((val = p.StandardOutput.Read())!= -1){ 
    fs.WriteByte((byte)val); 
} 

p.WaitForExit(); 
fs.Close(); 
3

Que diriez-vous p.StandardOutput.BaseStream?

+0

Que diriez-vous de donner une réponse complète? – SerG

+1

@SerG: Ceci est une réponse complète. La seule question posée était "Son [sic] là un moyen d'obtenir le flux binaire brut sous-jacent?" –