I am writing a program in Ruby which will search for strings in text files within a directory - similar to Grep.
I don\'t want it to attempt to search in binary files bu
libmagic is a library which detects filetypes. For this solution I assume, that all mimetype's which start with text/
represent text files. Eveything else is a binary file. This assumption is not correct for all mime types (eg. application/x-latex, application/json), but libmagic detect's these as text/plain.
require "filemagic"
def binary?(filename)
begin
fm= FileMagic.new(FileMagic::MAGIC_MIME)
!(fm.file(filename)=~ /^text\//)
ensure
fm.close
end
end
gem install ptools
require 'ptools'
File.binary?(file)
An alternative to using the ruby-filemagic
gem is to rely on the file
command that ships with most Unix-like operating systems. I believe it uses the same libmagic
library under the hood but you don't need the development files required to compile the ruby-filemagic
gem. This is helpful if you're in an environment where it's a bit of work to install additional libraries (e.g. Heroku).
According to man file
, text files will usually contain the word text
in their description:
$ file Gemfile
Gemfile: ASCII text
You can run the file command through Ruby can capture the output:
require "open3"
def text_file?(filename)
file_type, status = Open3.capture2e("file", filename)
status.success? && file_type.include?("text")
end