2010-02-27 14 views
6

मुझे पता है कि प्रोग्राम के लिए stdout/in/err हैं और मैं कंसोल आउटपुट के बजाय किसी प्रोग्राम के आउटपुट को फ़ाइल में रीडायरेक्ट करना चाहता हूं। और अब मैं यह पता लगा नीचे कोड के साथ:प्रोग्राम के StdOut स्ट्रीम को सीधे सी # में कैसे लिखें?

FileStream fs = File.Open(@"E:\console.txt", FileMode.OpenOrCreate); 
StreamWriter sw = new StreamWriter(fs); 
TextWriter old = Console.Out; 
Console.SetOut(sw); 
Console.Write("bbb"); 
sw.Flush(); 

लेकिन इस दृष्टिकोण कार्यक्रम के stdoutको Console.Out कनेक्ट करने और फाइल करने के लिए Console.Out पुनर्निर्देशित करना होता है। यह इस तरह से एक तरह से है:

Program.StdOut -> Console.Out -> फ़ाइल

Console.Out यहाँ एक पुल हो रहा है। मुझे यह पुल नहीं चाहिए और मैं आउटपुट बनाने के लिए कंसोल। राइट() का उपयोग नहीं करना चाहता हूं। मैं प्रोग्राम की stdout स्ट्रीम को लक्ष्य फ़ाइल सीधे पर कैसे मैप कर सकता हूं और कंसोल के बजाय प्रोग्राम के stdout पर सीधे लिख सकता हूं। राइट()? क्या मैं चाहता हूँ एक तरह से इस तरह है:

Program.StdOut -> फ़ाइल

Process.StandardOutput संपत्ति केवल मुझे एक केवल पढ़ने के लिए StreamReader वस्तु देता है। प्रक्रिया को कैसे लिखें। मानक आउटपुट ?? या प्रोग्राम का stdout कहां है?

बहुत धन्यवाद।

उत्तर

6

आप Console.OpenStandardOutput फोन करके आवेदन के stdout पर भी नियंत्रण प्राप्त कर सकते हैं। वहां से, आप स्ट्रीम के साथ जो चाहें कर सकते हैं, हालांकि आप इसे फिर से सौंपने में सक्षम नहीं होंगे। यदि आप ऐसा करना चाहते हैं तो आपको SetStdHandle पर P/Invoke करना होगा और विवरण स्वयं को संभालना होगा।

संपादित करें:

[DllImport("kernel32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetStdHandle(int nStdHandle, IntPtr nHandle); 

const int STD_OUTPUT_HANDLE = -11; 

static void RedirectStandardOutput(FileStream file) 
{ 
    SetStdHandle(STD_OUTPUT_HANDLE, file.SafeFileHandle.DangerousGetHandle()); 
} 
+0

धन्यवाद, माइकपी। मैं सोच रहा हूं कि कंसोल क्लास को OpenStandardOutput() विधि का दावा क्यों करें, प्रक्रिया विधि के तहत इस विधि को वर्गीकृत क्यों न करें, मुझे लगता है कि यह अधिक उचित होगा। किस प्रकार का डिज़ाइन दर्शन शामिल है? – smwikipedia

+0

मुझे नहीं पता कि उन्होंने इस विधि को क्यों चुना है। – MikeP

1

प्रक्रिया स्टार्टइन्फो और प्रक्रिया वर्गों का उपयोग करें और रीडायरेक्ट मानक मानक आउटपुट सेट करें, फिर आप स्ट्रीम से आउटपुट कैप्चर कर सकते हैं।

ProcessStartInfo info = new ProcessStartInfo("process.exe", "-arg1 -arg2"); 
info.RedirectStandardOutput = true; 
Process p = Process.Start(info); 
p.Start(); 
string output = p.StandardOutput.ReadToEnd(); 
+1

धन्यवाद, जेक। मैं जानना चाहता हूं कि process.exe में, प्रोग्राम के मानक आउटपुट को कैसे लिखना है? किस प्रकार का कोड लागू करता है? क्या यह अभी भी एक कंसोल है। राइट()? क्या इस विधि का उपयोग न करने और प्रोग्राम के स्टडआउट पर सीधे लिखने का कोई तरीका नहीं है? – smwikipedia

+0

आपको स्टडीऑट और अपनी दूसरी स्ट्रीम दोनों के कार्यक्रम के आउटपुट को टी करने की आवश्यकता है।एक तरीका है 'ReadToEnd() 'को कॉल करने के लिए एक लूप लिखना, दोनों आउटपुट को लिखें, फिर थोड़ा सोएं, स्ट्रीम बंद होने तक दोहराएं। – spoulson

+0

प्रक्रिया में डेटा भेजने के लिए 'info.UseShellExecute = false' और' p.StanardInput.Write() 'सेट करें। यदि प्रक्रिया डेटा को उजागर करती है, तो आप अच्छे होते हैं, लेकिन आप प्रक्रिया को हाइजैक नहीं कर सकते हैं और अपने मानक आउटपुट हैंडल का उपयोग स्वयं के रूप में कर सकते हैं। – Jake

6

आप शायद अपनी खुद की प्रक्रिया के stdout सेट नहीं चाहिए: जोड़ा गया पी के लिए उदाहरण कोड/मार्ग आह्वान। इसका कारण यह है कि कॉलर (कमांड लाइन, जो भी हो) इसे आपके प्रोग्राम के बिना कहीं भी रीडायरेक्ट कर सकता है।

इस प्रकार "टाइप foo.txt | अधिक" काम जैसी चीजें हैं। यदि टाइप कमांड को फ़ाइल में stdout को फिर से परिभाषित करने के लिए स्वतंत्र महसूस किया गया है, तो यह बिल्कुल काम नहीं करेगा।

यदि आप किसी स्ट्रीम में लिखना चाहते हैं, तो बस स्ट्रीम खोलें और इसे लिखें।

संबंधित मुद्दे