在不解压缩的情况下查找压缩文件是文本文件还是二进制文件

find whether a zipped file is text or binary without unzipping it

我正在创建一个 ruby 脚本,它遍历多个 zip 文件并验证其中任何 xml 文件的内容。为了优化我的脚本,我使用 ruby-zip gem 打开 zip 文件而不解压缩它们。

我最初的想法是使用 filemagic 来确定文件的 MIME 类型,但是 filemagic gem 需要一个文件路径,而我只有这些 Entry 和 InputStream 类 ruby-zip.

独有

有什么不用解压就能判断文件类型的好方法吗?最终我需要识别 xml 个文件,但我可以通过识别纯文本文件并使用正则表达式来查找

the filemagic gem takes a file path

filemagic gem 的 file 方法采用文件路径,但 file 不是它拥有的唯一方法。看一眼文档就会发现 it has an io method, too.

all I have are these Entry and InputStream classes which are unique to ruby-zip

我不会说 InputStream 是 "unique to ruby-zip." 来自 the docs(强调我的):

A InputStream inherits IOExtras::AbstractInputStream in order to provide an IO-like interface for reading from a single zip entry

所以 FileMagic 有一个 io 方法并且 Zip::InputStream 是 IO-like。这使我们找到了一个非常简单的解决方案:

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