2012-01-21 79 views
1

朋友,taglib-ruby和資源平衡(釋放文件句柄)?

我使用非常快taglib-ruby(0.2.1通過偕掃描他們的ID3標籤試圖處理一個巨大的使用紅寶石(1.9.3)腳本的音頻文件量服務器)庫。

這裏是我的代碼的一部分,而audio包含一個Ruby字符串完整的文件路徑:

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 我不沒有找到一定的Ruby方法taglib-ruby API,最終調用一個或更好兩者標籤庫 C-功能:

taglib_tag_free_strings(); 
taglib_file_free(file); 

libmagic Ruby綁定例如提供close - 在其Magic類中的方法,以便釋放whithin確保塊將工作。

我是否錯過了正確的用於taglib-ruby的Ruby方法或者此刻是否丟失?有沒有另外一種方式來釋放通過Ruby獲取的文件句柄?

回答

0

我假設你實際上使用的是taglib-ruby,而不是舊的ruby-taglib。如果您使用的是taglib-ruby,FileRef(和其他:: File類)從版本0.3.0開始具有明確的close方法,請參閱API documentation

更新:從0.4.0開始,更好的解決方案是使用open類方法,該方法接收一個塊並在塊運行後自動處理關閉。請參閱。舉例:

TagLib::FileRef.open(file_name) do |file| 
    tag = file.tag 
    # do things with tag 
end