2011-05-12 88 views
13
app=function(req,res) 
{ 
res.writeHead(200,{'Content-Type':'text/plain'}) 
var buffer=new Buffer(100) 
var fs=require('fs') 
fs.open('.'+req.url,'r',function(err,fd){ 
    fs.fstat(fd,function(err, stats){ 
    var i=0 
    var s=stats.size 
    console.log('.'+req.url+' '+s) 
    for(i=0;i<s;console.log(i)){ 
    i=i+buffer.length 
    fs.read(fd,buffer,0,buffer.length,i,function(e,l,b){ 
    res.write(b.toString('utf8',0,l)) 
    console.log(b.toString('utf8',0,l)) 
    }) 
    } 
    res.end() 
    fs.close(fd) 
    }) 
}) 
} 
http = require('http') 
server = http.createServer(app) 
server.listen(8000,"127.0.0.1") 
console.log('GET http://127.0.0.1:8000/appwsgi/www/index.htm') 

爲什麼這隻顯示來自979字節文件多次的最後100個字節?node.js fs.read()示例

爲什麼Chrome瀏覽器不顯示任何輸出?

[email protected]:~/http$ node server.js 
GET http://127.0.0.1:8000/appwsgi/www/index.htm 
./appwsgi/www/index.htm 979 
100 
200 
300 
400 
500 
600 
700 
800 
900 
1000 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 

oad.<br/> 
    <a href= 
"vi/vi.htm">vi</a> Edit online files on the server. 
    </div> 
</body> 
</html> 
+0

改寫異步在http://stackoverflow.com/questions/6233562/node-js-chunked – 2012-06-10 10:28:03

回答

7

所有的讀取都是使用相同的緩衝區異步發出的(即fs.read立即返回並且循環繼續)。在第一次調用異步回調時,顯然所有十次讀取都已完成(所以緩衝區包含上次讀取的結果)。既然你叫fs.read讀了10次,你會被回叫10次。所以你得到你所看到的。

瀏覽器不顯示任何內容,因爲您在第一次回調返回之前結束了響應。

0

由於您設計的應用程序一個接一個地處理文件(同步),因此您需要使用fs.readSync(),但需要警告的是,在您的應用程序以這種方式讀取文件時,它無法執行任何操作其他。

更好的方法是以「節點方式」處理文件,即異步處理文件。

- node.fs - 一條線,沒有等待

15

我知道這個問題是不是最新的,但我要去,因爲當我得到的問題如何打開這裏扔這件事(和讀)一個文件系統對象,快速搜索似乎總是指引我。

無論如何,這應該有助於未來的OP和其他人。

(filepath是實際文件名,包括路徑)

fs.open(filepath, 'r', function(err, fd) { 
    fs.fstat(fd, function(err, stats) { 
     var bufferSize=stats.size, 
      chunkSize=512, 
      buffer=new Buffer(bufferSize), 
      bytesRead = 0; 

     while (bytesRead < bufferSize) { 
      if ((bytesRead + chunkSize) > bufferSize) { 
       chunkSize = (bufferSize - bytesRead); 
      } 
      fs.read(fd, buffer, bytesRead, chunkSize, bytesRead); 
      bytesRead += chunkSize; 
     } 
     console.log(buffer.toString('utf8', 0, bufferSize)); 
     fs.close(fd); 
    }); 
}); 
+17

誰來檢查所有那些'err's?奧巴馬? – 2015-01-26 16:50:30

+0

爲什麼這段代碼可以工作?不是'fs.read'應該是'fs.readSync'嗎? – user619271 2016-04-24 08:51:13

1

我使用從上面的@ user1256169例如產生我需要的。在這裏,我使用async.whilst來更清晰地處理異步控制流。在示例的頂部,我正在同步閱讀文件和其統計,但如果需要,可以更改該文件。

var fs = require('fs'); 
var async = require('async'); 

var fd = fs.openSync('/path/to/cat.png', 'r'); 
var stats = fs.fstatSync(fd); 


var bufferSize = stats.size, 
    chunkSize = 512,//bytes 
    buffer = new Buffer(bufferSize), 
    bytesRead = 0; 

async.whilst(
    function() { 
     return bytesRead < bufferSize; 
    }, 
    function (done) { 
     if ((bytesRead + chunkSize) > bufferSize) { 
      chunkSize = (bufferSize - bytesRead); 
     } 
     // fd, buffer, offset, length, position, callback 
     fs.read(fd, buffer, bytesRead, chunkSize, bytesRead, 
     function (err, bytes, buff) { 
      if (err) return done(err); 
      var buffRead = buff.slice(bytesRead, bytesRead+chunkSize); 
      // do something with buffRead 
      bytesRead += chunkSize; 
      done(); 
     }); 
    }, 
    function (err) { 
     if (err) console.log(err); 
     fs.close(fd); 
    } 
);