いろんな文字コードでファイルを読み書きするにはADODB.Stream
昨日書いた通り、FileSystemObjectではUTF-8のテキストファイルを扱えない。そういうときはADODB.Streamを使う。これはUTF-8以外の文字コードも扱える。
ファイルの読み込み
var s = new ActiveXObject('ADODB.Stream'); s.type = 2; s.charset = 'utf-8'; s.open(); s.loadFromFile('C:\\data\\hoge.txt'); var text = s.readText(-1); s.close();
charasetプロパティに文字コード名を渡している。色々な文字コードに対応しているらしい。どれくらい対応しているのか、その一覧を探したんだけど見つからない。
また、文字コードの自動判別ができる。charsetプロパティに"_autodetect"を渡せば良い。
- typeプロパティにセットしている2は、テキストファイルを扱うよ、という意味。1にするとバイナリファイルを扱えるらしい(試してない)。
- readTextメソッドの引数の-1は、ファイルの中身全てを読み込むよ、という意味。-2を渡すと一行ずつ読み込むらしい(これも試してない。ファイルの終端に来たかどうかはEOSプロパティで調べるようだ)。
コードをよく見ると、ファイルを直接openするのではなく、ストリームをopenしてそこにファイルから読み込むようになってるのが興味深い。よくわからないけど、loadFromFile以外のメソッドを使って、ファイル以外のところから読み込むこともできそうだ。ADODBという名前から察するに、例えばデータベースとか?
ファイルの書き込み
var s = new ActiveXObject('ADODB.Stream'); s.type = 2; s.charset = 'utf-8'; s.open(); s.writeText('hello'); s.saveToFile('C:\\data\\hoge.txt', 2); s.close();
書き込みの際も、charsetプロパティに文字コード名を渡せばおk。
- saveToFileメソッドの第2引数の2は、上書きで書き込むよ、という意味。1を渡すと既にファイルがあった場合にエラーになる。
- 新しいファイルを作ることしかできない。追記/編集はない。...と思う。自信ない。
ここもやっぱりコードが興味深い。openして、writeTextして、その後でsaveToFileしている。たぶん、ファイル以外に書き出すこともできそうだ。知らないけど。blobとかかな。
よくわからないまま使ってる
なんかこれは名前からしてファイルを読み書きするためのコンポーネントではないと思う。MDACに含まれているらしいし、データベースアクセスに関するコンポーネントだ。よく昔はADODB.Recordsetとか使ったもんだ。ただ、たまたま柔軟な文字コードに対応したファイル読み書きもできたのでラッキー、ということなのかな。
しかしこの何もわからないまま使う感じがイヤだ。ちゃんと調べようと思ってMSDNライブラリのトップページで「ADODB.Stream」と検索したら、アホかというほど待たされて、結局待ちきれなくなって検索を中断した。どうなってんだMSDNライブラリの検索システムは。
VBのサンプルコードは無いよ
[VB]っていうカテゴリを付けておいて悪いけど、VB6/VBA/VBScriptのサンプルコードは面倒なので書かない。でも当然VBからもADODB.Streamは使えるはず。new ActiveXObjectの代わりにCreateObjectを使って(VB6/VBAなら参照設定に追加してNewする)、あとは文法をVB風に直すだけで動くと思う。