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')
Run Code Online (Sandbox Code Playgroud)
为什么这只是从979字节文件多次显示最后100个字节?
为什么chrome浏览器没有显示任何输出?
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>
Run Code Online (Sandbox Code Playgroud)
Jos*_*son 17
我知道这个问题不是最新的问题,但我会在这里讨论这个问题,因为当我遇到问题如何打开(和读取)文件系统对象时,快速搜索似乎总是指向我.
无论如何,这应该有助于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);
});
});
Run Code Online (Sandbox Code Playgroud)
所有读取都使用相同的缓冲区异步发出(即fs.read立即返回并继续循环).当第一次调用异步回调时,显然所有十个读取都已完成(因此缓冲区包含上次读取的结果).因为你10次调用fs.read,你会被召回10次.所以你得到你所看到的.
浏览器没有显示任何内容,因为您在第一个回调返回之前结束了响应.
我使用上面的@user1256169 示例来创建我需要的内容。这里我使用async.while来更干净地处理异步控制流。在示例的顶部,我正在同步读取文件及其统计信息,但如果需要,可以更改。
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);
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39727 次 |
| 最近记录: |