node.js fs.read()的例子

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个字节?

为什么铬浏览器不显示任何输出?

 gert@node:~/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> 

所有的读取都是使用相同的缓冲区asynchronous发出的(即fs.read立即返回,循环继续)。 在第一次调用asynchronouscallback的时候,显然所有的十次读取都已经完成(所以缓冲区包含了最后一次读取的结果)。 既然你叫fs.read读了10次,你就会被调回10次。 所以你得到你所看到的。

浏览器没有显示任何内容,因为在第一次callback返回之前已经结束了响应。

我知道这个问题并不是最新的,但是我要在这里讨论这个问题,因为当我遇到如何打开(和读取)一个文件系统对象的问题时,一个快速search似乎总是引导我到这里。

无论如何,这将有助于OP和未来的其他人。

(filepath是实际的文件名,包括path)

 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); }); }); 

我用上面的@ user1256169例子来创build我需要的东西。 在这里,我使用async.whilst来处理asynchronous控制stream更干净。 在示例的顶部,我正在同步读取文件及其统计信息,但如果需要的话可以更改。

 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); } ); 

由于您已经devise了一个接一个地处理文件(同步)的应用程序,因此您需要使用fs.readSync(),但要注意的是,当您的应用程序正在以这种方式读取文件时,则无法执行其他任何操作。

更好的方法是以“节点方式”处理文件,这是asynchronous的。

– node.fs – 一行,不等