2010-03-01 55 views
8

我正在用Ruby编写一个程序,它将在目录内的文本文件中搜索字符串 - 类似于Grep。Ruby:如何确定正在读取的文件是二进制文本还是文本

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

该程序需要在Windows和Linux上工作。

如果任何人都可以指出我的方向会很棒。

谢谢,

Xanthalas

回答

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

感谢约翰内斯quadruplebucky 。我会投两个答案,但我还没有所需的15声望。 – Xanthalas 2010-03-02 17:14:46

+1

-1。 ptools不是100%准确的。您应该使用mime类型 – puchu 2012-09-28 10:08:34

+3

ptools方法将识别以非拉丁字符(中文等)编写的UTF-8文本文件为“二进制”。正如@ puchu所说的,改用MIME类型。 – bhollis 2013-01-26 19:43:37

13

libmagic是检测文件类型的库。对于这个解决方案,我假设所有以text/开头的mimetype表示文本文件。其他东西是一个二进制文件。这个假设对于所有的MIME类型(例如application/x-latex,application/json)来说都是不正确的,但是libmagic将它们作为文本/纯文本进行检测。

require "filemagic" 

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

谢谢,这是一个很大的帮助。请注意,您需要[ruby-filemagic](https://github.com/blackwinter/ruby-filemagic)gem来运行此代码。 – 2013-06-26 21:37:03

+1

请注意,您可以使用'foo!〜bar'而不是'!(foo =〜bar)' – bfontaine 2015-02-12 21:04:15

2

使用ruby-filemagic宝石的替代方法是依靠file命令附带大多数的Unix类操作系统。我相信它使用相同的libmagic库,但不需要编译ruby-filemagic gem所需的开发文件。如果您处于安装附加库(如Heroku)的工作环境中,这很有帮助。

man file,文本文件通常会包含单词text在他们的描述:

$ file Gemfile 
Gemfile: ASCII text 

您可以运行通过红宝石file命令可以捕获输出:

require "open3" 

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