リンク: [ホーム] [自己紹介] [リンク集] [アルバム] [ソフトウェア] [発表文献] [その他]

まさおのChangeLogメモ / 2008-06-11

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2008-06-11 Wed

* File#size

コマンドラインからとCGIから呼ばれるRubyスクリプトを共用しようとお
もったが、File#size は無いらしい。ちょっと不便。

CGIライブラリのファイルアップロード実装では、アップロードされたファ
イルはそのサイズに応じて StringIO か Tempfile のいずかで実装される
が、これらはいずれも #size メソッドを持っているのだけど、File オブ
ジェクトには無いので、場合分けが必要になる。。。

File.size( foo ) だと File/Tempfile 両者は対応できるのだけど、
StringIO#to_io が無いために、これが効かない。。。

このあたりは、[ruby-dev:17266]でmatz氏が要望を却下している:
Tempfileクラスのドキュメントにsizeがあったからという理由で、
「Fileにあるはずだ」と考える人は少ないと思います。

「Fileにあるべきだ」と思う人は(青山さんのように)いらっしゃる
でしょうが、その場合には以下の理由で「File#sizeは誤解を招く
ので良くない」と説明します。

  sizeは「available data size」という意味と「file size」の二
  通りに解釈できるので、不適切な名前です。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/17253

どうせ、ファイル名でも場合分けをしたいので、以下のように書いておく:
    if @file.class == File
       size = @file.stat.size
         filename = @file.path
    else
       size = @file.size
         filename = @file.original_filename
    end