2013-03-20 4 views
3

Je ne fais que tester ZLIB de Node.js mais je suis rapidement confronté à des résultats étranges. Voici mon script (inspiré de l'exemple manuel Node.js http://nodejs.org/api/zlib.html#zlib_examples):Node.js - ZLIB Gunzip retourne le fichier vide

var zlib = require('zlib') , 
    fs = require('fs') , 
    inp1 = fs.createReadStream('file.txt') , 
    out1 = fs.createWriteStream('file.txt.gz') , 
    inp2 = fs.createReadStream('file.txt.gz') , 
    out2 = fs.createWriteStream('output.txt') ; 

inp1.pipe(zlib.createGzip()).pipe(out1); /* Compress to a .gz file*/ 
inp2.pipe(zlib.createGunzip()).pipe(out2); /* Uncompress the .gz file */ 

Dans cet exemple, et avant d'exécuter le script, j'ai créé un fichier appelé file.txt et je FULLFILL avec un échantillon de texte (par exemple un Lorem Ipsum).

Le script précédent crée avec succès le fichier .gz, que je peux décompresser depuis le finder (je suis sur Mac OSX), mais le fichier non compressé output.txt est vide.

Pourquoi? Avez-vous une idée?

Répondre

6

Les flux de nœuds sont asynchrones, de sorte que vos deux flux s'exécutent en même temps. Cela signifie que lorsque vous ouvrez initialement inp2, file.txt.gz est vide, car l'autre flux d'écriture n'y a encore rien ajouté.

var zlib = require('zlib') , 
    fs = require('fs'); 

var src = 'file.txt', 
    zip = 'file.txt.gz', 
    dst = 'output.txt'; 

var inp1 = fs.createReadStream(src); 
var out1 = fs.createWriteStream(zip); 

inp1.pipe(zlib.createGzip()).pipe(out1); 

out1.on('close', function(){ 
    var inp2 = fs.createReadStream(zip); 
    var out2 = fs.createWriteStream(dst); 
    inp2.pipe(zlib.createGunzip()).pipe(out2); 
}) 
+0

Vous avez raison loganfsmyth, et maintenant je comprends. Toujours oublier l'asynchronisme du noeud. Merci de votre aide. – htaidirt