1

友達、

非常に高速な (Gem-Server 経由で 0.2.1) ライブラリを使用してID3 タグをスキャンすることにより、 Ruby (1.9.3) スクリプトを使用して大量のオーディオ ファイルを処理しようとしています。taglib-ruby

これは私のコードの一部ですがaudio、Ruby-String に完全なファイル パスが含まれています。

begin 
  file_ref = TagLib::FileRef.new(audio) 
  unless file_ref.tag.nil? 
     unless file_ref.tag.artist.nil? or file_ref.tag.title.nil?
       …
     end
  end
ensure
 file_ref = nil
end

その後、処理のほぼ最後に問題が発生します。TagLibは読み取り権限がないことを訴えており、FileUtils.mv後でファイルを移動できなくなりました。私のスクリプトはファイル ハンドルを解放しないため、TagLibが処理中に食べている可能性があります。

残念ながら、API に特定の Ruby メソッドが見つかりませんでした。最終的にTagLibs C 関数の 1 つまたは両方を呼び出します。taglib-ruby

taglib_tag_free_strings();
taglib_file_free(file);

libmagicたとえば、Ruby バインディングはcloseそのMagicクラス内に -Method を提供するため、ブロックが確実に動作するように解放します。

の正しい Ruby メソッドtaglib-rubyが欠落しているだけですか、それとも現時点で欠落していますか? Ruby経由で取得したファイルハンドルを解放する別の方法はありますか?

4

1 に答える 1

0

古いruby​​-taglibではなく、実際にはtaglib-rubyを使用していると思います。taglib-ruby を使用している場合、FileRef (およびその他の ::File クラス) には、バージョン 0.3.0 以降の明示的なメソッドがあります。 API ドキュメントを参照してください。close

更新: 0.4.0 以降、さらに優れた解決策はopen、ブロックを受け取り、ブロックの実行後に自動的にクローズを処理するクラス メソッドを使用することです。open のドキュメントを参照してください。例:

TagLib::FileRef.open(file_name) do |file|
  tag = file.tag
  # do things with tag
end
于 2012-02-24T23:37:12.733 に答える