win32-file-stat のバグ(?)
でかいファイル(6GB越え)をWin32なRubyで扱いたくて,去年のるびまの記事を元にwin32-fileを使ってみたものの,やっぱりうまくいかない.
入れたのは rubygems 経由で,バージョンは次のとおり.
- win32-file-0.5.2-mswin32
- win32-file-stat-1.2.2-mswin32
- windows-pr-0.5.2-mswin32
とりあえず File.size の結果が変化しない.
C:\test>dir debug.txt ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は XXXX-XXXX です C:\test のディレクトリ 2006/07/28 23:50 14,444,178,638 debug.txt 1 個のファイル 14,444,178,638 バイト 0 個のディレクトリ 107,078,017,024 バイトの空き領域 C:\test>ruby -e 'puts File.size("debug.txt")' 1559276750 C:\test>ruby -rrubygems -e 'require "win32/file";puts File.size("debug.txt")' 1559276750
ソースを調べてみたら,4GBを越えるファイルのファイルサイズはやっぱり取得できていない.
こんな風にしてみた.
--- win32/file/stat.orig.rb 2006-07-31 13:57:26.553125000 +0900 +++ win32/file/stat.rb 2006-07-31 14:01:55.100000000 +0900 @@ -56,6 +56,7 @@ @gid = stat_buf[12, 2].unpack('s').first # Always 0 @rdev = stat_buf[16, 4].unpack('I').first # Same as dev @size = stat_buf[24, 4].unpack('L').first # Size of file in bytes + @size += stat_buf[28, 4].unpack('L').first * (1 << 32) @atime = Time.at(stat_buf[32, 4].unpack('L').first) # Access time @mtime = Time.at(stat_buf[40, 4].unpack('L').first) # Modification time @ctime = Time.at(stat_buf[48, 4].unpack('L').first) # Creation time
C:\test>dir debug.txt ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は XXXX-XXXX です C:\test のディレクトリ 2006/07/28 23:50 14,444,178,638 debug.txt 1 個のファイル 14,444,178,638 バイト 0 個のディレクトリ 107,078,017,024 バイトの空き領域 C:\test>ruby -e 'puts File.size("debug.txt")' 1559276750 C:\test>ruby -rrubygems -e 'require "win32/file";puts File.size("debug.txt")' 14444178638
うまくいっているように見えるのでフィードバックしようかと思ったけどrubyforge正直よくわからん…….
あと結局(現状は?) IO#pos とかが使えるようになるわけじゃないのね…… orz