2009-04-13 22 views
15

Nếu chương trình của tôi đang in trên bảng điều khiển, tôi thực hiện việc gói từ theo một cách nhất định theo Console.WindowWidth bằng cách chèn dòng mới - và điều này hoạt động hoàn hảo.Làm cách nào để xác định liệu Console.Out có được chuyển hướng đến tệp không?

Tuy nhiên, nếu đầu ra của chương trình được chuyển hướng đến tệp hoặc chương trình khác, tôi muốn nó bỏ qua gói từ. Làm thế nào tôi có thể phát hiện khi đây là trường hợp?

Console.WindowWidth trả về cùng một số trong cả hai trường hợp.

Thưởng điểm nếu giải pháp có thể phân biệt bảng điều khiển được chuyển hướng.Bởi từ bảng điều khiển được chuyển hướng.Error.

+0

bản sao có thể có của [Kiểm tra xem đầu ra có được chuyển hướng không] (http://stackoverflow.com/questions/1169591/check-if-output-is-redirected) –

Trả lời

11

p/gọi GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) hoặc gọi một chức năng điều khiển vô hại như GetConsoleScreenBufferInfo để kiểm tra lỗi xử lý không hợp lệ. Nếu bạn muốn biết về lỗi tiêu chuẩn, hãy sử dụng STD_ERROR_HANDLE. Tôi tin rằng bạn thậm chí có thể so sánh các tay cầm được trả về bởi GetStdHandle(STD_OUTPUT_HANDLE)GetStdHandle(STD_ERROR_HANDLE) để phát hiện các công cụ như 2>&1.

+0

Có, hoạt động hoàn hảo và minh bạch hơn các công cụ dựa trên phản chiếu. Cảm ơn! –

0

Tại sao gói ouput trong tệp được chuyển hướng? Các gói mà giao diện điều khiển không phải là bằng phương tiện ngắt dòng. Nói cách khác chuỗi này:

xin chào tôi tên là Andrew Hare

sẽ quấn trong một giao diện điều khiển gầy như thế này:

chào tôi nam
e là Andrew
Hare

nhưng nếu bạn chuyển hướng đầu ra vào một tập tin nó sẽ được viết như thế này:

xin chào tôi tên là Andrew Hare

vì không có đúng dòng-chia trong đầu ra.

+0

Chính xác - trong một bảng điều khiển gầy nó sẽ được gói trong một crappy đường.Đó là lý do tại sao chúng tôi đang gói chính mình (bằng cách chèn dòng mới và thụt đầu dòng thích hợp) trước khi xuất ra bàn điều khiển. Rõ ràng cách tiếp cận này cũng bao bọc đầu ra được chuyển hướng, đó là những gì chúng tôi đang cố tránh. –

+0

Được đặt lại để làm cho điều này rõ ràng hơn. –

8

Trong khi đây là một chút mờ ám và có lẽ là không được bảo đảm để làm việc, bạn có thể thử này:

bool isRedirected; 

try 
{ 
    isRedirected = Console.CursorVisible && false; 
} 
catch 
{ 
    isRedirected = true; 
} 

Calling CursorVisible ném một ngoại lệ khi giao diện điều khiển được chuyển hướng.

+0

Dường như làm việc cho stdout. Không phân biệt giữa các trường hợp khi chỉ có stderr, chỉ stdout hoặc cả hai được chuyển hướng. Vẫn ok cho một số trường hợp sử dụng mặc dù. –

+0

Nó luôn luôn làm việc cho tôi khi stdout được chuyển hướng, mà tôi sẽ tưởng tượng thực sự là người duy nhất có vấn đề, phải không? –

2

Bạn cần phải sử dụng phản ánh - một chút bẩn thỉu nhưng những điều sau đây sẽ làm việc:

static bool IsConsoleRedirected() 
{ 
    var writer = Console.Out; 
    if (writer == null || writer.GetType().FullName != "System.IO.TextWriter+SyncTextWriter") return true; 
    var fld = writer.GetType().GetField ("_out", BindingFlags.Instance | BindingFlags.NonPublic); 
    if (fld == null) return true; 
    var streamWriter = fld.GetValue (writer) as StreamWriter; 
    if (streamWriter == null) return true; 
    return streamWriter.BaseStream.GetType().FullName != "System.IO.__ConsoleStream"; 
} 
+0

Và làm thế nào để bạn chắc chắn rằng nó sẽ làm việc trong phiên bản tiếp theo của NET là tốt? :) – ibz

+0

Tại sao bỏ phiếu xuống? Đó là giải pháp duy nhất được đề xuất cho đến nay sẽ hoạt động ... –

+0

Đó là lý do tại sao nó hơi khó chịu. Nhưng đó là lựa chọn duy nhất. –

0

Đừng làm điều đó! Chỉ cần chuyển một tham số dòng lệnh bổ sung để chỉ định định dạng bạn muốn áp dụng. Việc mọi người sử dụng ứng dụng của bạn và những người sẽ làm việc trên mã của bạn trở nên đơn giản, sạch hơn và dễ hiểu hơn.

+2

Tôi không đồng ý. Các chương trình nên tự mình tìm ra những thứ trong phạm vi rộng nhất có thể và không hỏi người dùng mọi lúc. –

+0

Không đồng ý. Nhìn vào cách git cư xử. Các lệnh như 'git diff' pipe thông qua less và một số loại colorizer trừ khi chúng được piped hoặc chuyển hướng đến một tập tin. –

9

.NET 4.5 thêm Console.IsOutputRedirectedConsole.IsErrorRedirected.

Các vấn đề liên quan