2012-04-19 44 views
15

Tôi tự hỏi điều gì sẽ là cách tốt nhất để kiểm tra xem tệp có là nhị phân hay ASCII với Node.js không?Kiểm tra xem tệp có phải là nhị phân hoặc ASCII với Node.js không?

Có vẻ như hai cách không cụ thể cho Node.js:

  1. Kiểm tra định dạng MIME: How to Check if File is ASCII or Binary in PHP - tuy nhiên điều này có đó là vấn đề, như ví dụ trước precessors thường không có một nhận loại mime và trở lại application/octet-stream khi kiểm tra chúng bằng cách sử mime

  2. Qua kiểm tra kích thước byte sử dụng một bộ đệm dòng với How to identify the file content as ASCII or binary - mà có vẻ khá chuyên sâu, và không chưa cung cấp một ví dụ Node.js.

Có cách nào khác không? Có lẽ một cuộc gọi hoặc mô-đun node.js bí mật mà tôi không biết? Hoặc nếu tôi phải tự mình làm điều này, cách nào sẽ được đề xuất?

Cảm ơn

+0

Bạn có thể xác định ý nghĩa của một "tệp nhị phân" không? Cách bạn kiểm tra phụ thuộc vào chính xác những gì bạn có ý nghĩa và không có định nghĩa chung được thỏa thuận. –

+0

Giả sử hình ảnh hoặc cụ thể hơn bất kỳ nội dung nào không phải là văn bản. Xin lỗi vì điều đó! – balupton

+0

Điều đó thực sự không đủ cụ thể. Bạn dự định làm gì với thông tin? (Có đủ để kiểm tra 8KB đầu tiên cho các ký tự không phải ASCII không?) –

Trả lời

6

Nhờ nhận xét về câu hỏi này bởi David Schwartz, tôi đã tạo istextorbinary để giải quyết vấn đề này.

+0

Cân nhắc việc cập nhật đặt câu hỏi nếu ý định của bạn thực sự là xác định các tệp văn bản nói chung và không mã hóa ASCII cụ thể. – maerics

+5

Tại sao nên dùng coffeescrypt? – Lodewijk

+13

coffeescript ngăn mọi người dễ dàng gửi các bản vá lỗi. vì vậy bạn không cần phải duy trì nhiều. –

4

ASCII defines characters 0-127, vì vậy nếu toàn bộ nội dung của một tập tin là byte giá trị trong phạm vi đó thì nó có thể được coi là một tập tin ASCII.

function fileIsAscii(filename, callback) { 
    // Read the file with no encoding for raw buffer access. 
    require('fs').readFile(filename, function(err, buf) { 
    if (err) throw err; 
    var isAscii = true; 
    for (var i=0, len=buf.length; i<len; i++) { 
     if (buf[i] > 127) { isAscii=false; break; } 
    } 
    callback(isAscii); // true iff all octets are in [0, 127]. 
    }); 
} 
fileIsAscii('/usr/share/dict/words', function(x){/* x === true */}); 
fileIsAscii('/bin/ls', function(x){/* x === false */}); 

Nếu hiệu suất là then chốt thì hãy xem xét viết hàm C++ tùy chỉnh cho mỗi câu trả lời được liên kết của bạn.

Các vấn đề liên quan