いろんな文字コードでファイルを読み書きするには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風に直すだけで動くと思う。

参考にならなかった