taglib-ruby和资源平衡(释放文件句柄)?

时间:2012-01-21 21:09:56

标签: ruby id3 id3-tag taglib-ruby

我正在尝试使用 Ruby (1.9.3)脚本处理大量音频文件,方法是使用相当快的{{1}扫描 ID3-Tags (0.2.1通过Gem-Server)库。

以下是我的代码的一部分,而taglib-ruby包含Ruby-String中的完整文件路径:

audio

然后我几乎在处理结束时陷入困境。 TagLib 抱怨缺少读取权限,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 API中找不到某个Ruby方法,最终会调用 TagLibs C函数中的一个或更好:

taglib-ruby

taglib_tag_free_strings(); taglib_file_free(file); 例如,Ruby绑定在其libmagic类中提供了一个close - 方法,以便释放whith,确保块可以正常工作。

我是否只是错过了Magic的正确Ruby方法,还是暂时缺少?有没有另一种方法可以释放通过Ruby获取的文件句柄?

1 个答案:

答案 0 :(得分:0)

我假设你实际上在使用taglib-ruby,而不是旧的ruby-taglib。如果你正在使用taglib-ruby,那么从版本0.3.0开始,FileRef(和其他:: File类)有一个明确的close方法,请参阅API documentation

更新:从0.4.0开始,更好的解决方案是使用open类方法,该方法在块运行后自动为您处理关闭。见documentation of open。一个例子:

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