Project

General

Profile

Actions

Bug #5819

closed

Windowsで空のドライブのルートディレクトリに対するFile.stat が失敗する

Added by yamaminami (Masateru OKAMOTO) over 12 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 1.9.3p0 (2011-10-30) [i386-mswin32_100]
Backport:
[ruby-dev:<unknown>]

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) over 12 years ago

  • Status changed from Open to Assigned
  • Assignee set to usa (Usaku NAKAMURA)
Actions #2

Updated by usa (Usaku NAKAMURA) over 12 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].
Actions #3

Updated by yamaminami (Masateru OKAMOTO) over 12 years ago

r34205で失敗しなくなることを確認しました。
ありがとうございました。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0