2015-01-17 1 views
3

OS X 및 Linux에서 작동하는 크로스 플랫폼 루비 2 스크립트를 지원하지만 디렉토리 심볼릭 링크가 포함 된 트리를 제거하려고 시도하면 Windows에서 실패합니다. 다음은 irb에서 실행되는 가장 간단한 예제입니다. "parent"디렉토리에는 대상 디렉토리를 가리키는 "symlink"라는 심볼릭 링크가 있습니다. 대상이 존재합니다.디렉토리에 심볼릭 링크가있을 때 Ruby FileUtils.rm_r이 Windows에서 실패합니다 : 대안?

irb(main):001:0> require 'fileutils' 
=> true 
irb(main):003:0> FileUtils.rm_r 'parent' 
Errno::ENOENT: No such file or directory - parent/symlink 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `open' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `entries' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1349:in `entries' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `postorder_traverse' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1537:in `block in postorder_traverse' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `each' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:1536:in `postorder_traverse' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:837:in `remove_entry' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:695:in `block in rm_r' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:691:in `each' 
    from c:/engapps/Ruby/lib/ruby/2.0.0/fileutils.rb:691:in `rm_r' 

system('rmdir /s/q parent')과 같은 솔루션 외부에는 다른 옵션이 있습니까? Windows에서는 FileUtils.symlink()가 지원되지 않지만 FileUtils.rm_r()의 하드 코어 실패는 완전히 다른 것입니다. Win 7이 나왔을 때부터 Vista로 되돌아 왔고 CMD.EXE에 포격하지 않는 좋은 해결책을 찾지 못했기 때문에 이것은 문제가되었습니다.

참고 : FileUtils.rm_rf()는 작업을 향상시키지 않습니다.

답변

1

나는 ruby ​​2.0에서 fileutils.rb의 소스 코드와 그에 의존하는 코드를 읽었습니다. 이 소스에서 Windows 심볼릭 링크가 고려되지 않는다는 것이 명백합니다. 비록이 모듈 전체에서 Windows가 아닌 것보다 Win32에서 다르게 동작하는 코드가 있습니다. 루비가 Windows 심볼릭 링크와 관련하여 공개 티켓을 갖고 있지 않은 것 같습니다. 그래서 루비는 그것을 처리하지 못하며 조만간 그렇게 될 것입니다. 따라서 system('rmdir /s/q parent') 해결 방법은 심볼릭 링크가 포함 된 Windows 디렉토리 트리를 제거하는 것입니다.

관련 문제