From: Luis Lavena Date: 2011-02-02T22:25:35+09:00 Subject: [ruby-core:35044] File.directory?('...') behavior Hello, Some developers at RubyInstaller project and myself keep working to reduce API calls of Ruby on Windows. We have found that usage of GetFileAttributesEx [1] reduces FindFirstFile & FindClose operations, and all test_file.rb and test_dir.rb tests passes, except for one in test_file_exhaustive.rb: 1) Failure: test_directory_p(TestFileExhaustive) [ruby/test_file_exhaustive.rb:109]: Failed assertion, no message given. 74 tests, 547 assertions, 1 failures, 0 errors, 0 skips Further investigation shows this line: assert(!(File.directory?(@dir+"/..."))) Which evaluates File.directory?('...') existance. On Linux, this fails, as ... is not an existing directory, and on Windows using FindFirstFile failed too, but because it was performing a name globing operation looking for something named "...", always returning false. But on Linux, you can create a directory named "...": $ mkdir ... $ ls -la total 16 drwxr-xr-x 4 user user 4096 2011-02-02 10:04 . drwxr-xr-x 18 user user 4096 2011-02-01 23:00 .. drwxr-xr-x 2 user user 4096 2011-02-02 10:04 ... -rw-r--r-- 1 user user 0 2011-02-01 23:00 a.rb drwxr-xr-x 2 user user 4096 2011-02-01 23:00 bar $ ruby -ve "puts File.directory?('...')" ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux] true Windows do not fail as expected, as "..." is actually undefined: F:\tests>mkdir "..." A subdirectory or file ... already exists. F:\tests>dir "..." Volume in drive F is Virtual Volume Serial Number is 0A33-5C7A Directory of F:\tests\... File Not Found So GetFileAttributesEx for "..." works, since it identifies "..." but it can't find it. I was looking for any concrete example of this issue, but the revision 21447 that introduced that modification: * win32/win32.c (winnt_stat): gets rid of strange behavior of GetFileAttributes(). [ruby-core:21269] On this thread: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/21269 Presents the multiple dots example, disregard if the directories really exist. So, considering that "..." can be a directory under certain OS and filesystems, is valid to say that File.directory?("...") needs to return false regardless of it's existence? According to Windows API for testing if a something is a directory [2]: path = "C:/Users/Luis"; ret = PathIsDirectory(path); printf("PathIsDirectory: %s: %d\n", path, ret); path = "C:/Users/Luis/foo"; ret = PathIsDirectory(path); printf("PathIsDirectory: %s: %d\n", path, ret); path = "C:/Users/Luis/..."; ret = PathIsDirectory(path); printf("PathIsDirectory: %s: %d\n", path, ret); >gcc test.c -o test.exe -lshlwapi. >test.exe PathIsDirectory: C:/Users/Luis: 16 PathIsDirectory: C:/Users/Luis/foo: 0 PathIsDirectory: C:/Users/Luis/...: 16 But, asking PathCanonicalize [3]: path = "C:\\Users\\Luis\\......."; ret = PathCanonicalize(buffer, path); printf("PathCanonicalize: %s: %d, out: %s\n", path, ret, buffer); PathCanonicalize: C:\Users\Luis\.......: 1, out: C:\Users\Luis\ So I'm confused, it should be considered a bug of Ruby that it returns true for a non-existing directory, or can we assume behaves following the current platform support? Thank you for your time reading this. [1] http://msdn.microsoft.com/en-us/library/aa364946(v=vs.85).aspx [2] http://msdn.microsoft.com/en-us/library/bb773621(v=vs.85).aspx [3] http://msdn.microsoft.com/en-us/library/bb773569(v=vs.85).aspx -- Luis Lavena AREA 17 - Perfection in design is achieved not when there is nothing more to add, but rather when there is nothing more to take away. Antoine de Saint-Exup�ry