2010-03-01 32 views
8

Tôi đang viết một chương trình bằng Ruby sẽ tìm kiếm chuỗi trong các tệp văn bản trong một thư mục - tương tự như Grep.Ruby: Làm thế nào để xác định xem tập tin được đọc là nhị phân hay văn bản

Tôi không muốn tìm kiếm trong các tệp nhị phân nhưng tôi không thể tìm thấy cách nào trong Ruby để xác định xem tệp có là nhị phân hay văn bản hay không.

Chương trình cần hoạt động trên cả Windows và Linux.

Nếu có ai có thể chỉ cho tôi đúng hướng sẽ tuyệt vời.

Cảm ơn,

Xanthalas

Trả lời

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

Cảm ơn Johannes & quadruplebucky . Tôi sẽ bình chọn cả hai câu trả lời nhưng tôi chưa có 15 danh tiếng yêu cầu. – Xanthalas

+1

-1. ptools không chính xác 100%. bạn nên sử dụng các loại mime thay vì – puchu

+3

Phương pháp ptools sẽ xác định các tệp văn bản UTF-8 được viết bằng ký tự không phải la tinh (tiếng Trung, v.v) là "nhị phân". Như @puchu đã nói, hãy sử dụng các loại mime thay thế. – bhollis

13

libmagic là một thư viện trong đó phát hiện các loại file. Đối với giải pháp này tôi giả định, rằng tất cả các mimetype của bắt đầu với text/ đại diện cho các tập tin văn bản. Eveything khác là một tập tin nhị phân. Giả định này không đúng đối với tất cả các loại mime (ví dụ: application/x-latex, application/json), nhưng libmagic phát hiện chúng là text/plain.

require "filemagic" 

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

Cảm ơn, đó là một trợ giúp lớn. Lưu ý rằng bạn cần đá quý [ruby-filemagic] (https://github.com/blackwinter/ruby-filemagic) để chạy mã này. –

+1

Lưu ý bạn có thể sử dụng 'foo! ~ Bar' thay vì'! (Foo = ~ bar) ' – bfontaine

2

Một thay thế cho việc sử dụng ruby-filemagic đá quý là dựa trên file lệnh mà tàu với hầu hết các hệ điều hành Unix-like. Tôi tin rằng nó sử dụng cùng một thư viện libmagic dưới mui xe nhưng bạn không cần các tệp phát triển cần thiết để biên dịch viên đá quý ruby-filemagic. Điều này hữu ích nếu bạn đang ở trong môi trường nơi có một chút công việc để cài đặt các thư viện bổ sung (ví dụ: Heroku).

Theo man file, các file văn bản sẽ thường chứa từ text trong mô tả của họ:

$ file Gemfile 
Gemfile: ASCII text 

Bạn có thể chạy lệnh tập tin thông qua Ruby có thể nắm bắt đầu ra:

require "open3" 

def text_file?(filename) 
    file_type, status = Open3.capture2e("file", filename) 
    status.success? && file_type.include?("text") 
end 
Các vấn đề liên quan