まぁなんかいろいろありましたけど…
明日で旅行は終わり。今は帰り道の途中で、宿にいます。
昨日、いろいろやっていたのだが、HTTPからファイルをダウンロードしていろいろするプログラムがあったと。
インターネットつながってない、Apacheない、の状況で試験をしたかったが無理。
ソース書き換えるのめんどくさいなぁと思ったら、おもしろいヒントを得た。
file:///C:/work/foo.txt
のようなfileスキームで書いたURLを流し込めばどうなるか。
file:///C:/work/foo.txtはWindowsでのC:\work\foo.txt相当。
file:///とあると変な感じだが、これはfile://localhost/のようなものだと思うといい。
実際はlocalhostみたいなのは書かずに/が3つ連続したようなものになると。
当然UNIXのファイルシステムなら、file:///tmp/fooとかなるはず。
これを使ってみた。http://www.example.com/foo.txtとかなってたのをこれに変えてみた。
試してみたが、ほぼ思惑通り動いてくれた。
けどまったく変更なしでOKだったというわけではないんですよ。
HTTPのことについては「餅は餅屋と言うが、HTTPは.NET Framework?」の記事で取り上げてるね。
この記事でSystem.Net.HttpWebRequestにキャストすると便利だとか書いてあります。
実際これを使うといろいろできますので、実際使ったの。
けど、キャストできないこともあると。
なのでキャストできる場合とできない場合で処理を変えると。
System.Net.WebRequest req0=System.Net.WebRequest.Create(url);
System.Net.HttpWebRequest req=req0 as System.Net.HttpWebRequest;
System.IO.Stream sr=null;
if (req!=null) {
req.UserAgent="foo/bar";
sr=req.GetRequestStream();
} else {
sr=req0.GetRequestStream();
}
ここでポイントなのはas演算子です。
as System.Net.HttpWebRequestというのは、System.Net.HttpWebRequest型に変換の意味。
けど普通の括弧を使ったキャスト演算子との違いは、
キャストできなかったときnullになるというのがあると。
失敗して例外をスローするとか複雑なので、こういう場合はas演算子を使うといいかなと。
まぁ詳しくはいろいろあるわけだけど。
これを使って場合わけしています。
FTPなども調整すれば使えそうです。
as演算子はマイナーですからね。