2012-04-19 10 views
15

Mi chiedo quale sarebbe il modo migliore per verificare se un file è binario o ASCII con Node.js?Controlla se un file è binario o ASCII con Node.js?

Sembra che ci sia due modi non specifici per node.js:

  1. Verifica il tipo MIME: How to Check if File is ASCII or Binary in PHP - tuttavia questo ha i suoi problemi, come per esempio pre-precessors spesso non hanno un riconosciuto tipo MIME e ripristinare application/octet-stream durante il controllo utilizzando mime

  2. Via controllare il formato byte utilizzando un buffer ruscello con How to identify the file content as ASCII or binary - che sembra piuttosto intenso, e fornisce ancora un esempio node.js.

Quindi c'è già un altro modo? Forse una chiamata o un modulo segreto node.js di cui non sono a conoscenza? O se devo farlo io stesso, quale sarebbe il modo di suggerire?

Grazie

+0

Puoi definire cosa intendi per "file binario"? Il modo in cui testate dipende esattamente da cosa intendi e non esiste una definizione universalmente accettata. –

+0

Diciamo un'immagine, o più specificamente tutto ciò che non è testo. Mi dispiace per quello! – balupton

+0

Questo non è davvero abbastanza specifico. Cosa pensi di fare con le informazioni? (Sarebbe sufficiente controllare il primo 8 KB per caratteri non ASCII?) –

risposta

6

Grazie ai commenti su questa domanda da David Schwartz, ho creato istextorbinary per risolvere questo problema.

+0

Ti consigliamo di aggiornare il tuo domanda se il tuo intento fosse davvero quello di identificare i file di testo in generale e non la codifica ASCII in modo specifico. – maerics

+5

Perché così coffeescrypt? – Lodewijk

+13

coffeescript impedisce alle persone di inviare facilmente patch. quindi non devi mantenere molto. –

4

ASCII defines characters 0-127, quindi se tutto il contenuto di un file sono valori di byte in quella fascia di allora può essere considerato un file 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 */}); 

Se le prestazioni sono critiche, prendere in considerazione la possibilità di scrivere una funzione C++ personalizzata per la risposta collegata.

Problemi correlati