taglib ruby和资源平衡(释放文件句柄)?
朋友们 我正在尝试使用Ruby(1.9.3)脚本处理大量音频文件,方法是使用相当快的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
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