Bug #5819
closedWindowsで空のドライブのルートディレクトリに対するFile.stat が失敗する
Description
Windows Vista32bit版上の 1.9.3-p0,1.9.2-p290,1.8.7-p330で
File.statが失敗します。(すべてActiveScriptRubyパッケージで確認)
また、Vista 32bit + ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mingw32]
では成功しました。
ここでF:ドライブは ファイル/サブディレクトリが一切無い空っぽのFAT16の
USBドライブ(エクスプローラではリムーバブルディスクと表示)です。
FileUtils.touch 'F:\a.txt' としてファイルを作った後は一転して
成功するようになります。
c:>dir F:
ドライブ F のボリューム ラベルがありません。
ボリューム シリアル番号は 2850-20AE です
F:\ のディレクトリ
ファイルが見つかりません
c:>ruby -v
ruby 1.9.3p0 (2011-10-30) [i386-mswin32_100]
C:>irb
irb(main):001:0> require 'FileUtils'
=> true
irb(main):002:0> File.stat 'F:\'
Errno::ENOENT: No such file or directory - F:
from (irb):2:in stat' from (irb):2 from C:/Program Files/Ruby-1.9.3-p0/bin/irb.bat:19:in
'
irb(main):003:0> File.directory? 'F:\'
=> false
irb(main):004:0> FileUtils.touch 'F:\a.txt'
=> ["F:\a.txt"]
irb(main):005:0> File.stat 'F:\'
=> #<File::Stat dev=0x5, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x5, si
ze=0, blksize=nil, blocks=nil, atime=1970-01-01 09:00:00 +0900, mtime=1970-01-01
09:00:00 +0900, ctime=1970-01-01 09:00:00 +0900>
irb(main):006:0> File.directory? 'F:\'
=> true
File.statが失敗するためFile.directory?のみならず
FileUtils.mv(foo, 'F:\') や FileUtils.cp(bar, 'F:\')も
dstにファイル名を補うことができず失敗してしまいます。最初は理由が分からず
悩みました。(mvでは Errno::EINVAL: Invalid argumentとなる)
現在のwinnt_stat()はルートディレクトリが空だった場合に内部でcheck_valid_dir()の
FindFirstFileW("F:\.\*", )が失敗してしまう('.'すら存在しない)のが
直接の原因になっている様子です。
ドライブルートを特別扱いしてしまえば、丸く収まるんでしょうか。。。
Updated by naruse (Yui NARUSE) almost 13 years ago
- Status changed from Open to Assigned
- Assignee set to usa (Usaku NAKAMURA)
Updated by usa (Usaku NAKAMURA) almost 13 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r34205.
Masateru, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- win32/win32.c (check_valid_dir): special case for a root directory.
Reported by Masateru OKAMOTO at [Bug #5819].
Updated by yamaminami (Masateru OKAMOTO) almost 13 years ago
r34205で失敗しなくなることを確認しました。
ありがとうございました。