ホームページ >バックエンド開発 >C++ >C# コンソール アプリケーションで入力リダイレクトを検出するにはどうすればよいですか?

C# コンソール アプリケーションで入力リダイレクトを検出するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-12 17:01:47177ブラウズ

How Can I Detect Input Redirection in C# Console Applications?

C# コンソール アプリケーションでの入力リダイレクト検出のマスター

多くの C# コンソール アプリケーションでは、ユーザー入力がキーボードから発生するか、ファイルなどのリダイレクトされたソースから発生するかに応じて、異なる動作が必要になります。このガイドは、入力リダイレクトを検出するための堅牢なソリューションを提供します。

課題を理解する

コンソール アプリケーションは多くの場合、入力ソースに基づいて機能を適応させる必要があります。 この適応性を実現するには、入力がキーボードからのものなのか、外部ファイルからのものなのかを判断することが重要です。

効果的な解決策

最も信頼性の高い方法は、P/Invoke 経由で Wi​​ndows FileType() API 関数を使用します。この関数は、ファイル ハンドルに関連付けられたファイルのタイプを識別します。 以下の ConsoleEx ヘルパー クラスはこれを示しています。

<code class="language-csharp">using System;
using System.Runtime.InteropServices;

public static class ConsoleEx
{
    public static bool IsOutputRedirected => FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout));
    public static bool IsInputRedirected => FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin));
    public static bool IsErrorRedirected => FileType.Char != GetFileType(GetStdHandle(StdHandle.Stderr));

    // P/Invoke declarations:
    private enum FileType { Unknown, Disk, Char, Pipe };
    private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
    [DllImport("kernel32.dll")]
    private static extern FileType GetFileType(IntPtr hdl);
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetStdHandle(StdHandle std);
}</code>

実際の応用

入力リダイレクトを確認するには、単に次のように使用します。

<code class="language-csharp">bool isInputRedirected = ConsoleEx.IsInputRedirected;</code>

最新の .NET アプローチ

.NET Framework 4.5 以降のバージョンでは、Console クラス内でこの機能のサポートが組み込まれています。 IsInputRedirected プロパティは、直接的で簡単な解決策を提供します。

<code class="language-csharp">bool isInputRedirected = Console.IsInputRedirected;</code>

これらの手法を使用すると、入力リダイレクトを効果的に検出し、より柔軟で堅牢なコンソール アプリケーションを作成できます。

以上がC# コンソール アプリケーションで入力リダイレクトを検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。