File を open したままにしておくようなコーディングは、C言語レベルでの誤動作*1の原因となるため、あまり好ましくありません。きちんと明示的に close することが大切です。
while
str = File.open(name).read
:
end
で close を GC 任せにしたりせず、
while
begin
f = File.open(name)
str = f.read
ensure
f.close
end
:
end
もしくは
str = nil
while
File.open(name) { |f| str = f.read }
:
end
というように、close が保証されるようにしておいたほうが無難でしょう。 *2
IO からの読み出しは毎回新たなオブジェクトを生成します。ふつうは平気 ですが、意識していないとはた迷惑なプログラムが出来上がる場合があります。
400byte ほどのブロック二つを連結したものが別のバイナリファイルに入 ているかを調べるプログラムを作った時のこと。総ブロック数 400 個ほど を調べるのにスクリプトの中でループしてたら、たまにシステム全体が一分 程固まったりして。メモリ足りないとはいえ、これは良くない。
必要に応じてruby-list:23467[外部]みたいなものを作る方が良いでしょう。 もっと良いのはこんなことに ruby を使わないことかもしれないけど。 *3
*1 stdio でファイルディスクリプタを char でもってる。だもんで、どんどんファイル開いていくと、そのうちファイルディスクリプタが負になってEBADF。
*2version 1.7 以降なら
str = IO.read(name) とかでもok
*3version 1.7 以降なら read(400,buf) で ok