2

一部のプラットフォーム (Windows) では、File.symlinkが Ruby でサポートされていないため、NotImplemented例外が発生します。シンボリックリンクの有無にかかわらず動作するコードがいくつかあるので、適応させる必要があります。

シンボリックリンクがサポートされているかどうかを確認するために私が思いついた唯一の方法は、シンボリックリンクを作成することです:

  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

これは遅く (大量のファイル システム操作!)、扱いにくいようです。遅いことはメモ化によって処理できますが、それはすでに不格好な方法にさらに機械を追加するだけです。

File.symlinkがサポートされているかどうかを確認するためのより高速で洗練された方法はありますか?

4

1 に答える 1

3

これは次のtest_fileuils.rbとおりです。

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

このコードはシンボリック リンクを作成しません (ファイル システムには触れません)。シンボリックリンクをサポートするシステムTypeErrorでは、パラメーターのために a が発生しnilます。それ以外の場合 (Windows) は aNotImplementedErrorです。

于 2013-10-26T14:33:42.597 に答える