OpenStandardInput/OpenStandardOutput/OpenStandardErrorの各メソッドで得られる標準ストリームのStreamをラップすることにより、暗号化や圧縮・バッファリングなどの機能を付け加えることもできます。
次の例ではbase64
コマンドに似たプログラムを実装しています。 CryptoStreamを使って標準入出力のStreamをラップすることにより、標準入力から読み込んだ内容をBASE64エンコード/デコードして標準出力に書き込んでいます。
標準入出力のStreamをラップしてBASE64エンコード/デコードの機能を付け加える
using System;
using System.IO;
using System.Security.Cryptography;
class Sample {
static void Main(string[] args)
{
// コマンドライン引数に-dもしくは--decodeが指定されている場合はデコードを行う
var decode = false;
foreach (var arg in args) {
if (arg == "-d" || arg == "--decode")
decode = true;
}
Stream input, output;
if (decode) {
// BASE64デコードする場合
// 標準入力から読み込みを行い、FromBase64TransformによってBASE64デコードを行うCryptoStreamを入力元ストリームとする
input = new CryptoStream(Console.OpenStandardInput(), new FromBase64Transform(), CryptoStreamMode.Read);
// 標準出力を出力先ストリームとする
output = Console.OpenStandardOutput();
}
else {
// BASE64エンコードする場合
// 標準入力を入力元ストリームとする
input = Console.OpenStandardInput();
// ToBase64TransformによってBASE64エンコードを行い、標準出力へ書き込むCryptoStreamを出力先ストリームとする
output = new CryptoStream(Console.OpenStandardOutput(), new ToBase64Transform(), CryptoStreamMode.Write);
}
// 入力元ストリームの内容を出力先ストリームに'コピー'する
// (コピーを行う際、CryptoStreamによってデコード/エンコード処理が行われる)
input.CopyTo(output);
output.Close();
}
}
実行例
>type sample.txt Hello, world! >type sample.txt | sample.exe SGVsbG8sIHdvcmxkIQo= >type sample.txt | sample.exe | sample.exe -d Hello, world!
ストリームのラップについて、また暗号化や圧縮などのフォーマット変換、バッファリングなどの機能を付け加える方法等についてはストリームの基本とStreamクラス §.データフォーマットの変換やバッファリングなどの機能を追加するStream派生クラスも参照してください。
取得した標準ストリームを使う例として、コマンドラインオプションで標準入力とファイル入力を切り替える例を実装しているMD5ハッシュ文字列の作成 §.MD5クラスを使ってmd5sumコマンドを実装するもあわせてご覧ください。