友
我正在尝试使用 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获取的文件句柄?
答案 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