2010-03-01 7 views
8

Estoy escribiendo un programa en Ruby que buscará cadenas en archivos de texto dentro de un directorio, similar a Grep.Ruby: Cómo determinar si el archivo que se lee es binario o texto

No quiero que intente buscar en archivos binarios, pero no puedo encontrar una forma en Ruby para determinar si un archivo es binario o de texto.

El programa necesita funcionar tanto en Windows como en Linux.

Si alguien pudiera señalarme en la dirección correcta, sería genial.

Gracias,

Xanthalas

Respuesta

5
gem install ptools 
require 'ptools' 
File.binary?(file) 
+0

Gracias Johannes y quadruplebucky . Yo votaría ambas respuestas pero todavía no tengo la reputación requerida. – Xanthalas

+1

-1. ptools no es 100% exacto. debería usar tipos de mime en su lugar – puchu

+3

El método ptools identificará los archivos de texto UTF-8 escritos en caracteres no latinos (chinos, etc.) como "binarios". Como dijo @puchu, use tipos de mime en su lugar. – bhollis

13

libmagic es una biblioteca que detecta los tipos de archivo. Para esta solución, supongo que todos los tipos mimetype que comienzan con text/ representan archivos de texto. Todo lo demás es un archivo binario. Esta suposición no es correcta para todos los tipos de mime (por ejemplo, application/x-latex, application/json), pero los detect de libmagic son text/plain.

require "filemagic" 

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

Gracias, fue una gran ayuda. Tenga en cuenta que necesita la gema [ruby-filemagic] (https://github.com/blackwinter/ruby-filemagic) para ejecutar este código. –

+1

Tenga en cuenta que puede usar 'foo! ~ Bar' en lugar de'! (Foo = ~ bar) ' – bfontaine

2

Una alternativa al uso de la gema ruby-filemagic es confiar en el comando file que se incluye con la mayoría de sistemas operativos basados ​​en Unix. Creo que usa la misma biblioteca libmagic debajo del capó, pero no necesita los archivos de desarrollo necesarios para compilar la gema ruby-filemagic. Esto es útil si se encuentra en un entorno en el que es un poco difícil instalar bibliotecas adicionales (por ejemplo, Heroku).

Según man file, archivos de texto, habitualmente contendrá la palabra text en su descripción:

$ file Gemfile 
Gemfile: ASCII text 

puede ejecutar el comando de archivo a través de Ruby puede capturar la salida:

require "open3" 

def text_file?(filename) 
    file_type, status = Open3.capture2e("file", filename) 
    status.success? && file_type.include?("text") 
end 
Cuestiones relacionadas