2012-01-21 5 views
1

友人、taglib-rubyとリソースバランシング(ファイルハンドルの解放)?

私はGem-を経由してかなり速いtaglib-ruby(0.2.1を使用してそのID3タグをスキャンすることによってルビー(1.9.3)スクリプトを使用してオーディオファイルの膨大な量を処理しようとしていますサーバー)ライブラリ。 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のが食べているを処理していないので、これは、おそらくケースです。

Unfortunalty Iは、最終的に一つまたはより良いTAGLIBS C関数の両方の呼び出しtaglib-ruby APIにおける特定のルビ方法、見つかりませんドン:例えば

taglib_tag_free_strings(); 
taglib_file_free(file); 

libmagicのRubyバインディングをcloseを提供します - メソッドがそのMagicクラス内にあるので、ブロックを確実に解放することができます。

は、私はちょうどtaglib-rubyの正しいRubyのメソッドをしないのですか、それは現時点では欠けていますか? Rubyで取得したファイルハンドルを解放する別の方法はありますか?

答えて

0

私はtaglib-rubyを使用して、あなたが実際にあると仮定すると、いない古いruby-taglibよ。あなたはのtaglib-ルビー、FileRef(およびその他::ファイルクラス)を使用している場合は、バージョン0.3.0以降の明示的なclose方法を持って、API documentationを参照してください。

更新:012.0.4.0以降、ブロックを実行してブロックを実行した後自動的に閉鎖を処理するopenクラスメソッドを使用することも、さらに良い解決策です。 を参照してください。例:

TagLib::FileRef.open(file_name) do |file| 
    tag = file.tag 
    # do things with tag 
end 
関連する問題