Ruby: Как определить, является ли читаемый файл двоичным или текстовым - PullRequest
8 голосов
/ 01 марта 2010

Я пишу программу на Ruby, которая будет искать строки в текстовых файлах в каталоге - аналогично Grep.

Я не хочу, чтобы он пытался искать в двоичных файлах, но я не могу найти способ в Ruby определить, является ли файл двоичным или текстовым.

Программа должна работать как в Windows, так и в Linux.

Если бы кто-нибудь мог указать мне правильное направление, это было бы здорово.

Спасибо

*

Xanthalas 1011 *

Ответы [ 3 ]

14 голосов
/ 01 марта 2010

libmagic - это библиотека, которая определяет типы файлов. Для этого решения я предполагаю, что все mimetype, начинающиеся с text/, представляют собой текстовые файлы. Все остальное - это двоичный файл. Это предположение не верно для всех типов пантомимы (например, 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
5 голосов
/ 01 марта 2010
gem install ptools
require 'ptools'
File.binary?(file)
2 голосов
/ 01 января 2015

Альтернативой использованию гема ruby-filemagic является использование команды file, которая поставляется с большинством Unix-подобных операционных систем.Я считаю, что она использует ту же библиотеку libmagic под капотом, но вам не нужны файлы разработки, необходимые для компиляции гема ruby-filemagic.Это полезно, если вы находитесь в среде, где немного работы по установке дополнительных библиотек (например, Heroku).

Согласно man file, текстовые файлы обычно содержат в своем описании слово text:

$ file Gemfile
Gemfile: ASCII text

Вы можете запустить команду файла через Ruby, можете захватить вывод:

require "open3"

def text_file?(filename)
  file_type, status = Open3.capture2e("file", filename)
  status.success? && file_type.include?("text")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...