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

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

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

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

如果有人能指出我正确的方向,这将是伟大的。

谢谢,

Xanthalas

libmagic是一个检测文件类型的库。 对于这个解决方案,我假设所有以text/文本开头的mimetype表示文本文件。 Eveything else是一个二进制文件。 这个假设对于所有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 

使用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