2017-01-10 10 views
0

なぜfs.readfs.readSyncとして動作しないのでしょうか?fs.readの動作が異なります

私のコードは非常に単純です。ちょうどチャンクでチャンクファイルを読み込みます。そして、私はfs.readSyncファンクションを使って、fs.readファンクションでは、毎回512バイトを読み取ることができます。ログ情報は表示されません。while(readPosition < fileSize)を削除すると、1回だけ実行されます。

var chunkSize = 512; //the chunk size that will be read every time 
var readPostion = 0; //the first byte which will be read from the file. 
var fileSize =0; 
var fs=require('fs'); 
//var Buffer = require("buffer"); 


//var songsBuf = Buffer.alloc(512); 
var songsBuf = new Buffer(chunkSize); 
fs.open('/media/sdcard/song.mp3','r',function(err,fd){ 
    if(err) 
     throw err; 
    console.log("The file had been opened"); 

    var fileSize = fs.fstatSync(fd).size; 
    console.log("The total size of this file is:%d Bytes",fileSize); 

    console.log("Start to read the file chunk by chunk"); 

    //read the file in sync mode 
    while(readPostion<fileSize) 
    { 
     fs.readSync(fd,songsBuf,0,chunkSize,readPostion); 
     if(readPostion+chunkSize>fileSize) 
      chunkSize = fileSize-readPostion; 
     readPostion+=chunkSize; 
     console.log("the read position is %d",readPostion); 
     console.log("The chunk size is %d",chunkSize); 
     console.log(songsBuf); 
    } 
    //the code above can readout the file chunk by chunk but the below one cannot 
    //read the file in Async mode. 
    while(readPostion<fileSize) 
    { 
    // console.log("ff"); 
     fs.read(fd,songsBuf,0,chunkSize,1,function(err,byteNum,buffer){ 
     if(err) 
      throw err; 
     console.log("Start to read from %d byte",readPostion); 
     console.log("Total bytes are %d",byteNum); 
     console.log(buffer); 
     if(readPostion+chunkSize>fileSize) 
      chunkSize = fileSize-readPostion; //if the files to read is smaller than one chunk 
     readPostion+=chunkSize; 
     }); 
    } 

    fs.close(fd); 
}); 
+1

'fs.read'は非同期ですので、明らかに同期ループでは機能しません。 – idbehold

+0

私は全く新しいです。そして、私にそのヒントを与えてくれてありがとう、私はこれにもっと掘り下げよう。 – eric

答えて

0

これはasync libraryで行うことができます。

async.whilst(
    function() { return readPostion < fileSize }, 
    function (callback) { 
    fs.read(fd, songsBuf, 0, chunkSize, 1, function (err, byteNum, buffer) { 
     if (err) return callback(err) 
     console.log("Start to read from %d byte",readPostion); 
     console.log("Total bytes are %d",byteNum); 
     console.log(buffer); 
     if(readPostion + chunkSize > fileSize) 
     chunkSize = fileSize - readPostion; //if the files to read is smaller than one chunk 
     readPostion += chunkSize 
     callback(null, songBuffer) 
    }) 
    }, 
    function (err, n) { 
    if (err) console.error(err) 
    fs.close(fd) 
    // Do something with songBuffer here 
    } 
) 
+0

ありがとう、私はあなたのコードにもっと掘り下げます。 – eric

関連する問題