2012-04-19 88 views
15

我想知道什麼是檢查文件是二進制還是ASCII與Node.js的最佳方法?用Node.js檢查文件是二進制文件還是ASCII文件?

似乎有兩種方式並不是專門針對Node.js的:

  1. 檢查MIME類型:How to Check if File is ASCII or Binary in PHP - 然而,這有它的問題,因爲例如預precessors往往沒有一個公認的MIME類型和使用mime

  2. 通過使用流緩衝區How to identify the file content as ASCII or binary檢查字節大小檢查時,他們回覆到application/octet-stream - 這似乎很密集,但確實提供了一個Node.js的例子。

那麼現在還有其他辦法嗎?也許是我不知道的一個祕密node.js調用或模塊?或者如果我自己必須這樣做,會有什麼建議?

感謝

+0

你可以定義「二進制文件」的含義嗎?你測試的方式完全取決於你的意思,沒有普遍認同的定義。 – 2012-04-19 09:44:30

+0

讓我們來說一個圖像,或者更具體地說,不是文本的東西。對於那個很抱歉! – balupton 2012-04-19 09:47:28

+0

這真的不夠具體。你打算如何處理這些信息? (檢查第一個8KB的非ASCII字符是否足夠?) – 2012-04-19 10:00:18

回答

6

感謝David Schwartz對這個問題的評論,我創建了istextorbinary來解決這個問題。

+0

考慮更新你的問題是否你的意圖是真的識別一般的文本文件,而不是特別的ASCII編碼。 – maerics 2012-05-01 06:10:23

+5

爲什麼這麼咖啡加密? – Lodewijk 2014-02-16 23:59:52

+13

coffeescript阻止人們輕鬆提交補丁。所以你不必保持太多。 – 2014-07-27 11:23:12

4

ASCII defines characters 0-127,因此,如果一個文件的全部內容都在這個範圍內的字節值那麼就可以認爲是一個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 */}); 

如果性能很關鍵,那麼考慮爲每個鏈接的答案編寫一個自定義的C++函數。

相關問題