我正在用Ruby编写一个程序,它将在目录内的文本文件中搜索字符串 - 类似于Grep。Ruby:如何确定正在读取的文件是二进制文本还是文本
我不希望它尝试搜索二进制文件,但我无法在Ruby中找到一种方式来确定文件是二进制文件还是文本文件。
该程序需要在Windows和Linux上工作。
如果任何人都可以指出我的方向会很棒。
谢谢,
Xanthalas
我正在用Ruby编写一个程序,它将在目录内的文本文件中搜索字符串 - 类似于Grep。Ruby:如何确定正在读取的文件是二进制文本还是文本
我不希望它尝试搜索二进制文件,但我无法在Ruby中找到一种方式来确定文件是二进制文件还是文本文件。
该程序需要在Windows和Linux上工作。
如果任何人都可以指出我的方向会很棒。
谢谢,
Xanthalas
gem install ptools
require 'ptools'
File.binary?(file)
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
谢谢,这是一个很大的帮助。请注意,您需要[ruby-filemagic](https://github.com/blackwinter/ruby-filemagic)gem来运行此代码。 – 2013-06-26 21:37:03
请注意,您可以使用'foo!〜bar'而不是'!(foo =〜bar)' – bfontaine 2015-02-12 21:04:15
使用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
感谢约翰内斯quadruplebucky 。我会投两个答案,但我还没有所需的15声望。 – Xanthalas 2010-03-02 17:14:46
-1。 ptools不是100%准确的。您应该使用mime类型 – puchu 2012-09-28 10:08:34
ptools方法将识别以非拉丁字符(中文等)编写的UTF-8文本文件为“二进制”。正如@ puchu所说的,改用MIME类型。 – bhollis 2013-01-26 19:43:37