2012-01-26 10 views
10

मैं एक सांत्वना अनुप्रयोग है कि अक्षम या जब उत्पादन एक फ़ाइल या पाइप पर भेज दिया जाएगा (बाह्य) कुछ कार्यों सक्षम करना होगा (myapp.exe> ​​Foo.bar) हैमैं कैसे जांचूं कि मेरा डेल्फी कंसोल ऐप किसी फ़ाइल या पाइप पर रीडायरेक्ट किया गया है या नहीं?

मैं कैसे जांच कर सकते हैं मेरी डेल्फी सांत्वना एप्लिकेशन रीडायरेक्ट हो गई है एक फाइल या पाइप के लिए?

+0

संभव डुप्लिकेट [कैसे करता है, तो Console.In (stdin) को रीडायरेक्ट कर दिया गया है पता लगाने के लिए?] (Http://stackoverflow.com/questions/3453220/how-to-detect-if-console-in- stdin-गया-रीडायरेक्ट किया गया है) –

उत्तर

12

आप GetStdHandle और GetFileType कार्यों का उपयोग कर सकते हैं।

पहले आप कंसोल आउटपुट GetStdHandle समारोह का उपयोग कर संभाल निकालते हैं और फिर आप GetFileType समारोह के साथ संभाल के प्रकार देख सकते हैं।

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    Windows, 
    SysUtils; 


function ConsoleRedirected: Boolean; 
var 
    FileType : DWORD; 
begin 
    FileType:= GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)); 
    Result := (FileType=FILE_TYPE_PIPE) or (FileType=FILE_TYPE_DISK); 
end; 


begin 
    try 
    if ConsoleRedirected then 
     Writeln('Hello From File') 
    else 
     Writeln('Hello Console'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
की
+3

प्रलेखन का उल्लेख है कि 'File_Type_Char' "आमतौर पर एक एलपीटी डिवाइस या कंसोल है," इसलिए यह विधि आपको तब नहीं बता सकती है जब आपके प्रोग्राम का आउटपुट प्रिंटर पर रीडायरेक्ट किया जा रहा है:' myapp.exe> ​​LPT1'। –

+2

वास्तव में, लेकिन ओप विशेष रूप से '..is को फ़ाइल या पाइप पर रीडायरेक्ट करने के लिए पूछता है .. 'ताकि वह' परिणाम: = (FileType = FILE_TYPE_PIPE) या (FileType = FILE_TYPE_DISK) का उपयोग कर सके; 'कोड जो मेरे उत्तर पर टिप्पणी की गई है। – RRUZ

+0

@RRUZ अधिक संभावना है कि वे पहले दो प्रकार के पुनर्निर्देशन थे जो उसके सिर में चले गए थे। और यदि आप यही मानते हैं तो मुझे नहीं पता कि आपने उस संस्करण को क्यों टिप्पणी की। –

9

मैं जो दृष्टिकोण प्रस्तुत करता हूं वह हैकी लगता है लेकिन मुझे यह पता लगाने का एक बेहतर तरीका नहीं मिल रहा है कि मानक आउटपुट को स्क्रीन कंसोल से रीडायरेक्ट किया गया है या नहीं। GetFileType का उपयोग करने का दृष्टिकोण सभी प्रकार के पुनर्निर्देशन का पता नहीं लगा सकता है क्योंकि कुछ पुनर्निर्देशन FILE_TYPE_CHAR प्रकार के उपकरणों के लिए हैं।


मानक आउटपुट हैंडल को पारित GetConsoleMode() पर कॉल करें। यदि GetConsoleMode() विफल रहता है तो आपका कंसोल रीडायरेक्ट कर दिया गया है।

program RedirectionDetection; 
{$APPTYPE CONSOLE} 
uses 
  Windows; 

function ConsoleRedirected: Boolean; 
var 
  Mode: DWORD; 
begin 
    Result := not GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), Mode); 
end; 

begin 
  if ConsoleRedirected then begin 
    Writeln('I have been redirected'); 
  end else begin 
    Writeln('I am a console'); 
    Readln; 
  end; 
end. 
+1

उदाहरण के लिए एक्सेस अधिकारों के कारण 'GetConsoleMode' कंसोल मोड में विफल रहता है तो क्या होगा? – kobik

+2

@ कोबिक यह गेम खत्म हो गया है यदि आपको अपने कंसोल तक पहुंच नहीं मिली है !! –

+2

जो मैं पूछ रहा हूं वह है, यदि यह कथन एक तथ्य है: "अगर GetConsoleMode() विफल रहता है तो आपका कंसोल रीडायरेक्ट कर दिया गया है"। – kobik

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

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