新井です。

In message "[ruby-list:31789] File.rename on cygwin"
  on 09 Oct 2001 00:14:30 +0900,
  堀川 久 <vzw00011 / nifty.ne.jp> wrote:
> こんにちは。
> 
> ruby 1.6.5 (2001-09-19) [i686-cygwin]
> という環境で,次のコードを動かすと帰ってきません。
> 
>   def test1
>     # from=ファイル,to=ディレクトリのとき,どこに移動される?
>     from = "hoge"
>     to = "to"
>     File.open(from, "w") {}
>     Dir.mkdir to
>     File.rename from, to
>   end
> 
> Errno::EISDIRエラーが発生するはずですが,エラーにもなりません。
> 
> cygwinでディレクトリをunlink()するときの挙動の違いが影響しているようで
> すが,よく分かりません。
> 
> Rubyの方で手当てできないでしょうか?

堀川さんの環境がわかりませんが、うちの、Windows2000 だと特に
問題ありません(EISDIRにはなりませんが)。

    $ uname -a
    CYGWIN_NT-5.0 jl169 1.3.2(0.39/3/2) 2001-05-20 23:28 i686 unknown

    $ touch foo
    $ mkdir bar
    $ cat hoge.rb
    File.rename 'foo', 'bar'

    $ ruby -v /tmp/hoge.rb
    ruby 1.6.5 (2001-10-05) [i686-cygwin]
    /tmp/hoge.rb:1:in `rename': I/O error - "foo" (Errno::EIO)
	    from /tmp/hoge.rb:1
    [exit: 1]

ちなみに、添付のパッチを当てると

    $ ruby -v /tmp/hoge.rb
    ruby 1.6.5 (2001-10-05) [i686-cygwin]
    /tmp/hoge.rb:1:in `rename': Permission denied - "foo" (Errno::EACCES)
	    from /tmp/hoge.rb:1
    [exit: 1]

となります。(ソースのコメントにある Cygwin のバグってなんだろう?)


Index: file.c =================================================================== RCS file: /usr/local/cvsup/ruby/ruby/file.c,v retrieving revision 1.41.2.24 diff -u -u -r1.41.2.24 file.c --- file.c 18 Sep 2001 03:47:03 -0000 1.41.2.24 +++ file.c 8 Oct 2001 17:34:29 -0000 @@ -1179,7 +1179,7 @@ Check_SafeStr(to); if (rename(RSTRING(from)->ptr, RSTRING(to)->ptr) < 0) { -#if defined __CYGWIN__ +#if 0 /* defined __CYGWIN__ */ extern unsigned long __attribute__((stdcall)) GetLastError(); errno = GetLastError(); /* This is a Cygwin bug */ #endif -- 新井康司 (Koji Arai)