使用Node.js检查文件是二进制还是ASCII?

bal*_*ton 21 binary ascii node.js

我想知道用Node.js检查文件是二进制还是ASCII的最佳方法是什么?

似乎有两种不特定于node.js的方法:

  1. 检查MIME类型:如何在PHP中检查文件是ASCII还是二进制 - 但是这有问题,例如前驱动器通常没有识别的mime类型,并application/octet-stream在使用mime检查时恢复

  2. 通过使用流缓冲区检查字节大小,如何将文件内容标识为ASCII或二进制 - 这似乎非常密集,并且还提供了node.js示例.

那么还有另一种方式吗?也许是一个我不知道的秘密node.js呼叫或模块?或者如果我必须自己这样做,会建议采用什么方式?

谢谢

bal*_*ton 12

感谢David Schwartz对这个问题的评论,我创建了istextorbinary来解决这个问题.

  • coffeescript可以防止人们轻松提交补丁.所以你不必保持太多. (20认同)
  • 为什么咖啡如此加密? (6认同)
  • 如果您的目的确实是识别一般文本文件而不是专门识别 ASCII 编码,请考虑更新您的问题。 (2认同)
  • 对于它的价值,istextorbinary现在是javascript (2认同)

mae*_*ics 5

ASCII 定义了字符 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 */});
Run Code Online (Sandbox Code Playgroud)

如果性能至关重要,则考虑根据链接的答案编写自定义 C++ 函数。