【问题标题】:taglib-ruby and resource balancing (freeing file handles)?taglib-ruby 和资源平衡(释放文件句柄)?
【发布时间】:2023-04-10 23:52:01
【问题描述】:

朋友们,

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

这是我的代码的一部分,而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-Method,因此释放其中的确保块将起作用。

我只是错过了taglib-ruby 的正确 Ruby 方法,还是目前缺少?还有其他方法可以释放通过 Ruby 获取的文件句柄吗?

【问题讨论】:

    标签: ruby id3 id3-tag taglib-ruby


    【解决方案1】:

    我假设您实际上使用的是taglib-ruby,而不是旧的ruby-taglib。如果您使用的是 taglib-ruby,则 FileRef(和其他 ::File 类)从 0.3.0 版本开始具有显式的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2015-09-29
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多