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