2012-01-21 47 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