我正在创建一个ruby脚本,该脚本经过多个zip文件并验证其中任何xml文件的内容。为了优化我的脚本,我使用ruby-zip gem打开zip文件而不提取它们。
我最初的想法是使用filemagic来确定文件的MIME类型,但filemagic gem采用文件路径,而我所拥有的只是这些入口和InputStream类,这些是ruby-zip独有的。
有没有一种很好的方法来确定文件类型而不提取?最终我需要识别xml文件,但我可以通过识别纯文本文件并使用正则表达式来查找
答案 0 :(得分:2)
filemagic gem采用文件路径
filemagic gem的file
方法采用文件路径,但file
不是唯一的方法。浏览文档可以看出it has an io
method, too。
我所拥有的是这些Entry和InputStream类,它们是ruby-zip
独有的
我不会说InputStream是“ruby-zip独有的”。来自the docs(强调我的):
InputStream继承IOExtras :: AbstractInputStream,以便提供类似IO的界面,以便从单个zip条目中读取
因此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