Check if a File is Binary or Text in Ruby

Dec 15, 2014 Ruby

Sometimes when you want to read a file in Ruby you need to know whether that file is binary or text, to help you avoid some unwelcome errors.

We can accomplish this by using a gem called ruby-filemagic. We're going to look at the MIME type of the file, and if it's not text, then we'll assume it's binary. We can do something like this:

require 'filemagic'

def text?(filename)
  begin
    fm = FileMagic.new(FileMagic::MAGIC_MIME)
    fm.file(filename) =~ /^text\//
  ensure
    fm.close
  end
end

def binary?(filename)
  !text?
end

Then you can run:

> text?("/path/to/my/file.png")
# => false

In addition, since you're typically going to be working with the path of the file (as a string), we could extend the String class to make this a little prettier to write. However, you might want to get more specific with your method naming.

require 'filemagic'

class String

  def text_file?
    begin
      fm = FileMagic.new(FileMagic::MAGIC_MIME)
      fm.file(self) =~ /^text\//
    ensure
      fm.close
    end
  end

  def binary_file?
    !text?
  end

end

Then you can run this instead:

> "/path/to/my/file.png".text_file?
# => false

> "/path/to/my/file.png".binary_file?
# => true

References:

Did you learn something or find this article interesting?

If so, why not