OpenStandardInput/OpenStandardOutput/OpenStandardErrorの各メソッドで得られる標準ストリームのStreamをラップすることにより、暗号化や圧縮・バッファリングなどの機能を付け加えることもできます。
次の例ではbase64
コマンドに似たプログラムを実装しています。 CryptoStreamを使って標準入出力のStreamをラップすることにより、標準入力から読み込んだ内容をBASE64エンコード/デコードして標準出力に書き込んでいます。
標準入出力のStreamをラップしてBASE64エンコード/デコードの機能を付け加える
Imports System
Imports System.IO
Imports System.Security.Cryptography
Class Sample
Shared Sub Main(ByVal args As String())
' コマンドライン引数に-dもしくは--decodeが指定されている場合はデコードを行う
Dim decode As Boolean = false
For Each arg As String In args
If arg = "-d" OrElse arg = "--decode" Then decode = True
Next
Dim input, output As Stream
If decode Then
' 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)
End If
' 入力元ストリームの内容を出力先ストリームに'コピー'する
' (コピーを行う際、CryptoStreamによってデコード/エンコード処理が行われる)
input.CopyTo(output)
output.Close()
End Sub
End Class
実行例
>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コマンドを実装するもあわせてご覧ください。