2009-07-23 27 views
7

मेरे पास सी # में एक कंसोल एप्लिकेशन लिखा गया है जो कुछ डेटा को संसाधित करता है और फिर परिणाम प्रिंट करता है। परिणाम उपलब्ध होने तक एक छोटी एनीमेशन (/ - \ |) और प्रगति प्रतिशत (xx%) है जो लगातार अद्यतन हो रहा है।जांचें कि आउटपुट रीडायरेक्ट किया गया है

स्पष्ट रूप से यदि उपयोगकर्ता मेरे आवेदन के आउटपुट को रीडायरेक्ट करता है तो यह टेक्स्ट फ़ाइल पर मुद्रित किया जाएगा जहां आउटपुट को रीडायरेक्ट किया जाता है। यदि संभव हो तो मैं इससे बचना चाहूंगा।

तो क्या यह पता लगाने का कोई तरीका है कि मेरे आवेदन का आउटपुट रीडायरेक्ट किया गया है या नहीं? मैं निर्दिष्ट पैरामीटर के साथ चलते समय केवल प्रगति संकेतक दिखा रहा हूं, लेकिन मुझे आशा है कि किसी के पास मेरे लिए अच्छा जवाब होगा।

+0

यह तीन साल बाद आपके प्रश्न को पढ़ने में दिलचस्प है और यह समझ रहा है कि यह कितना मूर्ख था :-) यदि कोई इसे पढ़ रहा है ... तो इसका दृष्टिकोण करने का सही तरीका निश्चित रूप से प्रगति पट्टी को डिफ़ॉल्ट रूप से नहीं दिखाया जाना चाहिए ... केवल जब एक विशिष्ट स्विच का उपयोग किया जाता है तो इसे प्रदर्शित करें। – Nippysaurus

+0

संभावित डुप्लिकेट [मैं कैसे निर्धारित कर सकता हूं कि Console.Out को एक फ़ाइल में रीडायरेक्ट किया गया है?] (Http://stackoverflow.com/questions/743885/how-can-i-determine-whether-console-out-has- रीडायरेक्ट-टू-ए-फाइल) –

उत्तर

2

आप नहीं कर सकते। पुनर्निर्देशित आउटपुट निष्पादन कार्यक्रम के दायरे से पूरी तरह से और पूरी तरह से बाहर है। आप कर सकते हैं हालांकि अपने सुंदर आउटपुट को अक्षम करने के लिए एक कमांडलाइन विकल्प जोड़ें ताकि इसे रीडायरेक्ट भी किया जा सके।

संपादित करें: आप (अब) ... .NET 4.5 के साथ (Matt Brooks' answer देखें)।

+0

जैसा मैंने सोचा था। <शायद मुझे क्ली पैरामीटर विकल्प के साथ जाना होगा। – Nippysaurus

+0

क्या होगा यदि इनपुट कंसोल से जाता है या नहीं, इस पर निर्भर करता है कि मैं कुछ डिफ़ॉल्ट सेटिंग्स अनुमान लगा सकता हूं या नहीं? उदाहरण के लिए, एसक्यूएल पार्सर में कीबोर्ड से कमांड स्वीकार करते समय परिणामी रिकॉर्डसेट प्रिंट करना अच्छा होता है, लेकिन फ़ाइल को पार्स करते समय चुप रहें। या अगर फ़ाइल में लिखते समय मुझे यूनिकोड बीओएम आउटपुट करने की परवाह है तो क्या होगा? इन मामलों में किस पैटर्न का उपयोग किया जाना चाहिए? – himself

+0

@ खुद: यदि आप एक बीओएम लिखने जैसी चीजों को संभालना चाहते हैं, तो आउटपुट पैरामीटर के लिए पूछें। ओएस के आधार पर, आप यह पता लगा सकते हैं कि आप कंसोल पर चल रहे हैं, लेकिन यह कम से कम कहने के लिए दृढ़ है, और यह विंडोज/सी # पर काम नहीं करता है, मुझे नहीं लगता। आपकी सबसे सरल शर्त '-q' (शांत) या इसी तरह के विकल्प को स्वीकार करना है, या शायद मान लें कि आपको प्रोग्राम किए गए इनपुट मिल रहे हैं यदि आपने फ़ाइल में लिखने के लिए विकल्प सक्षम किया है। –

3

यह निर्धारित करने की कोशिश करने की बजाय कि सामग्री को रीडायरेक्ट किया गया है या नहीं, मैं आपके परिणाम और कंसोल प्रिंट करने के लिए कंसोल। राइटलाइन (या कंसोल.ऑट.राइटलाइन) का उपयोग करूंगा। त्रुटि। अपने स्टेटस अपडेट के लिए लिखें। स्क्रीन आउटपुट ठीक से दिखाएगा लेकिन टेक्स्ट फ़ाइल में दिखाई नहीं देगा।

+0

अच्छा विचार, हालांकि यह stderr को गैर-त्रुटि डेटा लिखने के लिए भ्रामक है। – Nippysaurus

+0

भ्रामक, हाँ, लेकिन एक आम प्रथा सभी समान है। –

5

आप मूल विधि GetConsoleMode का उपयोग यह देखने के लिए कर सकते हैं कि stdout कंसोल पर जा रहा है या नहीं।

इस विधि WriteConsole के लिए दस्तावेज़ में की गयी टिप्पणी ने सुझाव दिया जाता है:

... निर्धारित उत्पादन संभाल एक कंसोल संभाल है कि क्या (एक विधि GetConsoleMode फ़ंक्शन को कॉल करें और देखें कि क्या यह सफल होता है करने के लिए है) ...

+0

ग्रैनटेड, इसका मतलब असुरक्षित मूल तरीकों का उपयोग करना है ... लेकिन यह संभव है। – Stobor

+0

पी/Invoke एक दर्द है, लेकिन ऐसा लगता है कि यह काम करने योग्य होगा। –

+0

कुछ गुण 'GetConsoleMode' कहते हैं और विफलता पर फेंकते हैं, जैसे कि' कंसोल। कर्सर विस्बल '। इससे P/Invoke का उपयोग किए बिना कंसोल आउटपुट की जांच करने की अनुमति मिल जाएगी। – Medinoc

7

यह पता चला है के रूप में, यह जल्द ही सुंदर और पार मंच तरीका में उपलब्ध हो जाएगा: link

+0

बहुत अच्छा ठंडा है :-) – Nippysaurus

2

शायद आप इस कोशिश कर सकते हैं:

public enum FileType : uint 
{ 
    FILE_TYPE_UNKNOWN = 0x0000, 
    FILE_TYPE_DISK = 0x0001, 
    FILE_TYPE_CHAR = 0x0002, 
    FILE_TYPE_PIPE = 0x0003, 
    FILE_TYPE_REMOTE = 0x8000, 
} 

public enum STDHandle : uint 
{ 
    STD_INPUT_HANDLE = unchecked((uint)-10), 
    STD_OUTPUT_HANDLE = unchecked((uint)-11), 
    STD_ERROR_HANDLE = unchecked((uint)-12), 
} 

[DllImport("Kernel32.dll")] 
static public extern UIntPtr GetStdHandle(STDHandle stdHandle); 
[DllImport("Kernel32.dll")] 
static public extern FileType GetFileType(UIntPtr hFile); 

static public bool IsOutputRedirected() 
{ 
    UIntPtr hOutput = GetStdHandle(STDHandle.STD_OUTPUT_HANDLE); 
    FileType fileType = (FileType)GetFileType(hOutput); 
    if (fileType == FileType.FILE_TYPE_CHAR) 
     return false; 
    return true; 
} 

मानक आउटपुट पुनः निर्देशित नहीं है, तो GetFileType के उत्पादन() 0x0002 होना चाहिए। यह मेरे लिए काम करता है। :)

0

Console.Write("whatever") (और WriteLine) वास्तव में Console.Out के पीछे स्ट्रीम में डेटा लिखते हैं। हमेशा कंसोल पर एक प्रगति बार दिखाने के लिए और यह एक फ़ाइल पर लिख नहीं, कोई फर्क नहीं पड़ता अगर उत्पादन एक फाइल करने के लिए नहीं पुनः निर्देशित या है, बजाय त्रुटि धारा का उपयोग करें:

Console.Error.Write("<your progress bar>");

किसी एप्लिकेशन को रीडायरेक्ट > ऑपरेटर (DIR C:\*.*>MORE) के साथ उत्पादन, केवल Console.Out रीडायरेक्ट हो गई है और .नेट फ्रेमवर्क 4.5 से नहीं Console.Error

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