我正在创建一个 ruby 脚本,该脚本会遍历多个 zip 文件并验证其中任何 xml 文件的内容。为了优化我的脚本,我使用 ruby-zip gem 打开 zip 文件而不提取它们。
我最初的想法是使用 filemagic 来确定文件的 MIME 类型,但 filemagic gem 采用文件路径,我所拥有的只是这些 Entry 和 InputStream 类,它们是 ruby-zip 独有的。
有没有一种好方法可以在不提取的情况下确定文件类型?最终我需要识别 xml 文件,但我可以识别纯文本文件并使用正则表达式来查找
FileMagic Gem 采用文件路径
filemagic gem 的 file
方法采用文件路径,但file
并不是它唯一的方法。看一眼文档就会发现它也有一个io
的方法。
我所拥有的只是这些 Entry 和 InputStream 类,它们是 ruby-zip 独有的
我不会说 InputStream 是"ruby-zip 独有的"。来自文档(强调我的(:
InputStream 继承了 IOExtras::AbstractInputStream,以便为从单个 zip 条目读取提供类似 IO 的接口
所以FileMagic有一个io
的方法,Zip::InputStream是IO类的。这给我们带来了一个非常简单的解决方案:
require 'filemagic'
require 'zip'
Zip::InputStream.open('/path/to/file.zip') do |io|
entry = io.get_next_entry
FileMagic.open(:mime) do |fm|
p fm.io(entry.get_input_stream)
end
end