2012-04-19 17 views
15

Me pregunto cuál sería la mejor manera de comprobar si un archivo es binario o ASCII con Node.js?¿Comprueba si un archivo es binario o ASCII con Node.js?

Parece que hay dos maneras que no son específicos para Node.js:

  1. Comprobación del tipo MIME: How to Check if File is ASCII or Binary in PHP - sin embargo, esto tiene sus problemas, como por ejemplo pre-precessors a menudo no tienen una reconocida tipo MIME y volver a application/octet-stream cuando controle usando mime

  2. Via comprobar el tamaño en bytes utilizando un tampón corriente con How to identify the file content as ASCII or binary - que parece bastante intensa, y que sin embargo proporcionan un ejemplo Node.js.

¿Ya hay otra manera? ¿Quizás una llamada o módulo secreto de node.js que no conozco? O si tengo que hacer esto yo mismo, ¿qué camino se sugiere?

Gracias

+0

¿Puedes definir lo que quieres decir con un "archivo binario"? La forma en que prueba depende precisamente de lo que quiere decir y no hay una definición universalmente aceptada. –

+0

Digamos una imagen, o más específicamente, cualquier cosa que no sea texto. ¡Lo siento por eso! – balupton

+0

Eso no es lo suficientemente específico. ¿Qué planeas hacer con la información? (¿Sería suficiente verificar los primeros 8 KB para caracteres que no sean ASCII?) –

Respuesta

6

Gracias a los comentarios de esta cuestión por David Schwartz, yo creamos istextorbinary para resolver este problema.

+0

Considere actualizar su pregunta si tu intención era identificar los archivos de texto en general y no la codificación ASCII específicamente. – maerics

+5

¿Por qué tan coffeescrypt? – Lodewijk

+13

coffeescript evita que las personas puedan enviar parches fácilmente. para que no tengas que mantener mucho. –

4

ASCII defines characters 0-127, por lo que si la totalidad de los contenidos de un archivo son valores de bytes en ese rango, entonces puede ser considerado como un archivo 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 */}); 

Si el rendimiento es crítico, entonces considere escribir una función personalizada de C++ para su respuesta vinculada.

Cuestiones relacionadas