2013-10-26 5 views
2

На некоторых платформах (Windows)не поддерживается Ruby, создавая исключение NotImplemented. У меня есть код, который может работать с символическими ссылками или без них, поэтому он должен адаптироваться.Как определить, поддерживается ли File.symlink

Единственный способ я придумал, чтобы выяснить, действительно ли или не поддерживаются символические ссылки, чтобы попытаться создать:

def symlink_supported? 
    Dir.mktmpdir do |dir| 
     target_path = File.join(dir, 'target') 
     symlink_path = File.join(dir, 'symlink') 
     FileUtils.touch target_path 
     begin 
     FileUtils.ln_s target_path, symlink_path 
     true 
     rescue NotImplementedError 
     false 
     end 
    end 
    end 

Это медленно (много операций файловой системы!), И кажется неуклюжим. Медленным может быть обработано memoization, но это просто добавляет больше машин к уже неуклюжим методу.

Есть ли более быстрый или элегантный способ узнать, поддерживается ли File.symlink?

ответ

3

Это происходит из test_fileuils.rb:

def check_have_symlink? 
    File.symlink nil, nil 
rescue NotImplementedError 
    return false 
rescue 
    return true 
end 

код не создает символические ссылки (она даже не прикасаться к файловой системе). В системах, поддерживающих символические ссылки, возникает TypeError из-за параметра nil, в противном случае (Windows) a NotImplementedError.

+0

Faster _and_ более изящный. Благодаря! –

Смежные вопросы