1

朋友们,

我正在尝试使用Ruby (1.9.3) 脚本通过使用相当快的(0.2.1 通过 Gem-Server)库扫描它们的ID3-Tags来处理大量音频文件。taglib-ruby

这是我的代码的一部分,同时audio包含 Ruby-String 中的完整文件路径:

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在处理时正在吃东西。

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

taglib_tag_free_strings();
taglib_file_free(file);

libmagic例如,Ruby 绑定close在其Magic类中提供了一个 -Method,因此释放其中的确保块将起作用。

我只是缺少正确的 Ruby 方法taglib-ruby还是目前缺少?是否有另一种释放通过 Ruby 获得的文件句柄的方法?

4

1 回答 1

0

我假设您实际上使用的是taglib-ruby,而不是旧的ruby​​-taglib。如果您使用的是 taglib-ruby,则 FileRef(和其他 ::File 类)close从 0.3.0 版本开始具有显式方法,请参阅API 文档

更新:从 0.4.0 开始,一个更好的解决方案是使用open类方法,它接受一个块并在块运行后自动为您处理关闭。请参阅open 的文档。一个例子:

TagLib::FileRef.open(file_name) do |file|
  tag = file.tag
  # do things with tag
end
于 2012-02-24T23:37:12.733 回答