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

taglib ruby和资源平衡(释放文件句柄)?,ruby,id3,id3-tag,taglib-ruby,Ruby,Id3,Id3 Tag,Taglib Ruby,朋友们 我正在尝试使用Ruby(1.9.3)脚本处理大量音频文件,方法是使用相当快的taglib Ruby(0.2.1 via Gem Server)库扫描它们的ID3标记 这是我代码的一部分,而audio以Ruby字符串形式包含完整的文件路径: begin file_ref = TagLib::FileRef.new(audio) unless file_ref.tag.nil? unless file_ref.tag.artist.nil? or file_ref.t

朋友们

我正在尝试使用Ruby(1.9.3)脚本处理大量音频文件,方法是使用相当快的
taglib Ruby
(0.2.1 via Gem Server)库扫描它们的ID3标记

这是我代码的一部分,而
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在处理时正在吃东西

不幸的是,我在
taglib Ruby
API中没有找到某个Ruby方法,它最终调用了一个或两个更好的TagLibs C函数:

taglib_tag_free_strings();
taglib_file_free(file);
例如,
libmagic
Ruby绑定在其
Magic
类中提供了一个
close
-方法,这样释放whithin可以确保块工作


我只是缺少了
taglib Ruby
的正确Ruby方法,还是现在缺少了它?是否有其他方法可以释放通过Ruby获得的文件句柄?

我假设您实际上使用的是,而不是旧的。如果您使用的是taglib ruby,FileRef(和其他::File类)自0.3.0版以来有一个显式的
close
方法,请参阅

更新:自0.4.0以来,一个更好的解决方案是使用
open
类方法,该方法获取块并在块运行后自动为您处理关闭。看见例如:

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