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