Ruby:如何确定正在读取的文件是二进制还是文本

时间:2010-03-01 12:53:37

标签: ruby file-io

我正在用Ruby编写一个程序,它将在目录中的文本文件中搜索字符串 - 类似于Grep。

我不希望它尝试搜索二进制文件,但我无法在Ruby中找到确定文件是二进制还是文本的方法。

该程序需要在Windows和Linux上运行。

如果有人能指出我正确的方向,那就太好了。

谢谢,

Xanthalas

3 个答案:

答案 0 :(得分:14)

libmagic是一个检测文件类型的库。对于这个解决方案,我假设所有以text/开头的mimetype都代表文本文件。 Eveything是一个二进制文件。这个假设对于所有mime类型都不正确(例如,application / x-latex,application / json),但是libmagic检测它们是text / plain。

require "filemagic"

def binary?(filename)
  begin
    fm= FileMagic.new(FileMagic::MAGIC_MIME)
    !(fm.file(filename)=~ /^text\//)
  ensure
    fm.close
  end
end

答案 1 :(得分:5)

gem install ptools
require 'ptools'
File.binary?(file)

答案 2 :(得分:2)

使用ruby-filemagic gem的另一种方法是依赖大多数类Unix操作系统附带的file命令。我相信它使用相同的libmagic库,但您不需要编译ruby-filemagic gem所需的开发文件。如果您处于安装其他库(例如Heroku)的工作环境中,这将非常有用。

根据man file,文字文件通常会在其说明中包含text字样:

$ file Gemfile
Gemfile: ASCII text

您可以通过Ruby运行file命令来捕获输出:

require "open3"

def text_file?(filename)
  file_type, status = Open3.capture2e("file", filename)
  status.success? && file_type.include?("text")
end