我正在用Ruby编写一个程序,它将在目录中的文本文件中搜索字符串 - 类似于Grep。
我不希望它尝试搜索二进制文件,但我无法在Ruby中找到确定文件是二进制还是文本的方法。
该程序需要在Windows和Linux上运行。
如果有人能指出我正确的方向,那就太好了。
谢谢,
Xanthalas
答案 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