Issue #6851 has been updated by h.shirosaki (Hiroshi Shirosaki).


The behavior is same (not raises exception) as before r36668.


C:\>ruby -ve "p File.stat('C:/...')"
ruby 2.0.0dev (2012-08-08 trunk 36657) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
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>

C:\>ruby -ve "p File.stat('C:/....')"
ruby 2.0.0dev (2012-08-08 trunk 36657) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
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>


That seems due to r34205 and r34216.
Revert will solve this issue, but #5819 is not solved on the following corner case.
I think revert might be better. What do you think?


x:\ is empty drive. (ramdisk)

# this case is ok
C:\>miniruby -I. -e "p File.stat('x:/')"
#<File::Stat dev=0x17, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x17, size=0, blksize=nil, bl
ocks=nil, atime=2012-08-10 19:48:37 +0900, mtime=2012-08-10 19:48:37 +0900, ctime=2012-08-10 19:48:3
7 +0900>

# but this case fails
C:\>miniruby -I. -e "p File.stat('x:/.../..')"
-e:1:in `stat': No such file or directory - x:/.../.. (Errno::ENOENT)
        from -e:1:in `<main>'



diff --git a/win32/win32.c b/win32/win32.c
index de655df..11f20ba 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4562,15 +4562,6 @@ check_valid_dir(const WCHAR *path)
     if (wcsstr(path, L"...") == NULL)
 	return 0;
 
-    /* if the specified path is the root of a drive and the drive is empty, */
-    /* FindFirstFile() returns INVALID_HANDLE_VALUE. */
-    if (!GetFullPathNameW(path, sizeof(full) / sizeof(WCHAR), full, &dmy)) {
-	errno = map_errno(GetLastError());
-	return -1;
-    }
-    if (full[1] == L':' && !full[3] && GetDriveTypeW(full) != DRIVE_NO_ROOT_DIR)
-	return 0;
-
     fh = open_dir_handle(path, &fd);
     if (fh == INVALID_HANDLE_VALUE)
 	return -1;

----------------------------------------
Bug #6851: Result of File.stat("c:/...") is different from 1.9.3
https://bugs.ruby-lang.org/issues/6851#change-28759

Author: phasis68 (Heesob Park)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]


What is the correct result of File.stat("c:/...") on Windows?

File#stat for path like "c:/..." succeeds on trunk 36676.

C:\>ruby -ve 'p File.stat("c:/...")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:27 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:\>ruby -ve 'p File.stat("c:/....")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:32 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

C:\>ruby -ve 'p File.stat("c:/..../..")'
ruby 2.0.0dev (2012-08-10 trunk 36676) [i386-mswin32_100]
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=
0, blksize=nil, blocks=nil, atime=2012-08-10 14:53:45 +0900, mtime=2012-08-10 09
:40:33 +0900, ctime=2011-04-08 19:43:44 +0900>

But, File#stat raises exception on Ruby 1.9.3.

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/...")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in `stat': Invalid argument - c:/... (Errno::EINVAL)
        from -e:1:in `<main>'

C:\Ruby193\bin>ruby -ve 'p File.stat("c:/....")
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32]
-e:1:in `stat': No such file or directory - c:/.... (Errno::ENOENT)
        from -e:1:in `<main>'



-- 
http://bugs.ruby-lang.org/