2010-03-01 5 views
8

Ich schreibe ein Programm in Ruby, die nach Strings in Textdateien innerhalb eines Verzeichnisses suchen - ähnlich wie Grep.Ruby: Wie zu bestimmen, ob Datei gelesen wird binär oder Text

Ich möchte nicht versuchen, in Binärdateien zu suchen, aber ich finde keinen Weg in Ruby zu bestimmen, ob eine Datei binär oder Text ist.

Das Programm muss sowohl unter Windows als auch unter Linux funktionieren.

Wenn mir jemand in die richtige Richtung zeigen könnte, wäre das toll.

Danke,

Xanthalas

Antwort

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

Dank johannes & quadruplebucky . Ich würde beide Antworten wählen, aber ich habe noch nicht die erforderliche Reputation. – Xanthalas

+1

-1. Ptools ist nicht 100% genau. Sie sollten stattdessen MIME-Typen verwenden. – puchu

+3

Die ptools-Methode identifiziert UTF-8-Textdateien, die in nicht lateinischen Zeichen (Chinesisch usw.) geschrieben sind, als "binär". Wie @puchu sagte, verwende stattdessen Mime-Typen. – bhollis

13

libmagic ist eine Bibliothek, die Dateitypen erkennt. Für diese Lösung gehe ich davon aus, dass alle MIME-Typen, die mit text/ beginnen, Textdateien darstellen. Alles andere ist eine Binärdatei. Diese Annahme ist nicht für alle MIME-Typen korrekt (zB application/x-latex, application/json), aber libmagic erkennt diese als text/plain.

require "filemagic" 

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

Danke, das war eine große Hilfe. Beachten Sie, dass Sie den Edelstein [ruby-filemagic] (https://github.com/blackwinter/ruby-filemagic) benötigen, um diesen Code auszuführen. –

+1

Hinweis: Sie können 'foo! ~ Bar' anstelle von'! (Foo = ~ bar) 'verwenden – bfontaine

2

Eine Alternative die ruby-filemagic Juwel mit auf der file Befehl, der Schiffe mit den meisten Unix-ähnlichen Betriebssystemen verlassen. Ich glaube, es verwendet die gleiche libmagic-Bibliothek unter der Haube, aber Sie benötigen nicht die Entwicklungsdateien erforderlich, um die ruby-filemagic Edelstein zu kompilieren. Dies ist hilfreich, wenn Sie sich in einer Umgebung befinden, in der zusätzliche Bibliotheken (z. B. Heroku) installiert werden müssen.

Nach man file, Textdateien enthalten in der Regel das Wort text in ihrer Beschreibung:

$ file Gemfile 
Gemfile: ASCII text 

Sie können die Datei-Befehl über Ruby-ausführen können die Ausgabe erfassen:

require "open3" 

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