PrismBox > Tips >

 
C# Tips
 
No.0001 URLのリソースからテキスト取得
この例のコンソールアプリケーションは引数に指定したURLを開いてテキストとして取得し、画面に表示します。
using System;
using System.IO;
using System.Net;

namespace prismbox.sample.httpclient {
    class Class1 {
        static void Main(string[] args) {
            // 気持ち程度の引数チェック
            if (args.Length != 1) {
                Console.WriteLine("引数にURLを指定してください");
                return;
            }

            try {
                // WebClientを作成
                WebClient wc = new WebClient();
                
                // WebClientからStreamとStreamReaderを作成
                // args[0]にはURLが入っているものとする
                Stream st = wc.OpenRead(args[0]);
                StreamReader sr = new StreamReader(st);
                
                // リソースからすべて読み取ってコンソールに書き出す
                Console.WriteLine(sr.ReadToEnd());
                
                // StreamとStreamReaderを閉じる
                sr.Close();
                st.Close();
                
            } catch (Exception e) {
                // URLのファイルが見つからない等のエラーが発生
                Console.WriteLine("エラーが発生しました\r\n\r\n" + e.ToString());

            }

            return;
        }
    }
}
最初に引数が1つ付いているかチェックしています。内容については調べていないのでエラーになれば「try ~ catch」ブロックで処理されます。 WebClientクラスはURI(ここではURLと同じと捉えても問題ないかと)で表現されるリソースについてデータの送受信をするためのクラスで、 この例ではURLのリソースからダウンロードしたデータの読み取り用のストリームを取得するのに使っています。 あとは一般的なストリームと同じように処理します。この例では ReadToEnd() ですべて読み取って画面に書き出しています。 ただし、Unicode以外のテキストは考慮していないので、このままでは日本語が文字化けしてしまいます。 たとえばシフトJISコードを使う場合は次のようにStreamReaderのコンストラクタでエンコーディングを指定します。
StreamReader sr = new StreamReader(st, System.Text.Encoding.GetEncoding("shift-jis"));
また、この例ではストリームの読み取りを一気に行っていますが、次のように行単位で読み込み・書き出しを行うこともできます。 ストリームの Peek() は読み取り可能な文字がない場合に「-1」を返すのでwhile文でループすることでテキストは最後まで書き出せます。
while (sr.Peek() > -1) {
    Console.WriteLine(sr.ReadLine());
}
この例はバイナリ(画像ファイルなど)を扱うようにはできていないので、ファイルにリダイレクトしてもアプリケーションから開けるファイルは得られません。 バイナリを取得する方法については別の機会に取り上げる予定です。