gpt4 book ai didi

node.js - 如何通过设置正确的偏移量和位置来读取文件并使用手动缓冲写入 Nodejs 中的响应?

转载 作者:搜寻专家 更新时间:2023-10-31 23:15:59 28 4
gpt4 key购买 nike

我想以 64 字节为间隔读取一个文件。而且我也不想使用任何内部实现缓冲的功能。我想手动缓冲。所以我开始使用 fs.read()。我很努力,但我真的不知道如何设置 position ,它告诉从文件中的何处读取和缓冲区中的 offset 开始写入。
所以我找到了一些资源并开始自己实现。但我所做的似乎完全错了。请在下面找到我的代码。

app.get('/manualBufferAnother', function (req, res, next) {
var filePath = path.join(__dirname, 'Koala.jpg');
console.log("FilePath is: "+filePath);
var fileName = path.basename(filePath);
var mimeType = mime.lookup(filePath);
var stat = fs.statSync(filePath);

res.writeHead(200, {
"Content-Type": mimeType,
"Content-Disposition" : "attachment; filename=" + fileName,
'connection': 'keep-alive',
"Content-Length": stat.size,
"Transfer-Encoding": "chunked"
});

fs.open(filePath, 'r', function(err, fd) {
var completeBufferSize = stat.size;
var offset = 0; //is the offset in the buffer to start writing at
var length = 511; //is an integer specifying the number of bytes to read
var position = 0; //is an integer specifying where to begin reading
from in the file. If position is null, data will be read from the current file position
var buffer = new Buffer(completeBufferSize);
buf(res,fd,offset,position,length,buffer,stat);
});
});

var buf = function(res,fd,offset,position,length,buffer,stat) {
if(position+buffer.length < length) {
fs.read(fd,buffer,offset,length,position,function(error,bytesRead,bufferr {
res.write(bufferr.slice(0,bytesRead));
console.log("Bytes Read: "+bytesRead);
position=position+bufferr.length;
buf(res,fd,offset,position,length,bufferr,stat);
})
} else {
fs.read(fd,buffer,offset,length,position,function(error,bytesRead,bufferr) {
console.log("Bytes Read in else: "+bytesRead);
res.end(bufferr.slice(0,bytesRead));
fs.close(fd)
})
}
}

我知道这段代码做错了很多事。但我不知道正确的方法。我应该使用任何循环来设置和存储位置和偏移值吗?如果您能为我提供很好的引用,真的会有帮助吗?

最佳答案

这是一个例子:

res.writeHead(...);
var SIZE = 64; // 64 byte intervals
fs.open(filepath, 'r', function(err, fd) {
fs.fstat(fd, function(err, stats) {
var bufferSize = stats.size;
var buffer = new Buffer(bufferSize),
var bytesRead = 0;

while (bytesRead < bufferSize) {
var size = Math.min(SIZE, bufferSize - bytesRead);
var read = fs.readSync(fd, buffer, bytesRead, size, bytesRead);
bytesRead += read;
}
res.write(buffer);
});
});

Should I use any loop for setting and storing position and offset values?

是的,你可以,但要小心。在 Node.js 中,大多数文件系统功能都是异步(非阻塞)。您可能已经意识到,将异步函数放入循环中会导致问题。您可以通过以下方式判断函数是否异步查看 Node.js 文档并检查是否有回调 参数。所以在循环中使用 read 是不好的。我们可以改用 readSync。这是同步(阻塞)并且类似于 C 的 read() 函数(也是阻塞的)。

I really don't know how to set position which tells where to read from the file and offset in the buffer to start writing at.

readSync 的参数函数控制从文件中读取的位置以及写入目标缓冲区中的位置。

//                        /----- where to start writing at in `buffer`    
fs.readSync(fd, buffer, offset, length, position)
// \------- where to read from in the
// file given by `fd`

注意:上述风格是 C 语言的惯用风格,但在 Javascript 中,它被认为是糟糕的做法——代码无法很好地扩展。一般来说,您永远不想使用同步函数,因为它们会阻塞 Javascript 使用的单线程执行(也称为“blocking the event loop”)。
来自 Express.js :

Synchronous functions and methods tie up the executing process until they return. A single call to a synchronous function might return in a few microseconds or milliseconds, however in high-traffic websites, these calls add up and reduce the performance of the app. Avoid their use in production. Although Node and many modules provide synchronous and asynchronous versions of their functions, always use the asynchronous version in production.

使用 .pipe()Streams(异步风格)通常是您想要最惯用和最高效代码的方式。很抱歉这样说:没有官方来源/流行网站会描述通过 C 样式阻塞和缓冲使用同步函数的文件操作,因为这在 Node.js 中是不好的做法。

关于node.js - 如何通过设置正确的偏移量和位置来读取文件并使用手动缓冲写入 Nodejs 中的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293717/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com