【问题标题】:find whether a zipped file is text or binary without unzipping it在不解压缩的情况下查找压缩文件是文本还是二进制文件
【发布时间】:2017-02-09 15:25:05
【问题描述】:

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

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

有没有一种不用解压就可以确定文件类型的好方法?最终我需要识别 xml 文件,但我可以摆脱识别纯文本文件并使用正则表达式来查找

【问题讨论】:

    标签: ruby rubyzip ruby-2.3


    【解决方案1】:

    filemagic gem 采用文件路径

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

    我只有这些 ruby​​-zip 独有的 Entry 和 InputStream 类

    我不会说 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多