无法使用Node.js读取和写入二进制数据

时间:2013-12-17 03:24:30

标签: node.js file-io

寻找一些新的NodeJS帮助。有一些简单的东西我可以忽略,但我试图通过这几种方式,并不断得出奇怪的结果。

我从 this question 中获取了以下大部分代码。

// 128Kb Chunks
var targetSize = 131072;

// Open the file
fs.open('/project/input.png', 'r', function(err, fd) {

    // Gather some info about the file
    fs.fstat(fd, function(err, stats) {
        var bufferSize=stats.size,
            chunkSize=targetSize,
            buffer=new Buffer(bufferSize),
            bytesRead = 0,
            isFinal = false;

        while (bytesRead < bufferSize) {

            if ((bytesRead + chunkSize) > bufferSize) {
                chunkSize = (bufferSize - bytesRead);
                isFinal = true;
            } else {
                isFinal = false;
            }

            fs.read(fd, buffer, bytesRead, chunkSize, bytesRead);

            bytesRead += chunkSize;

            if( isFinal ) {
                fs.writeFileSync("/project/output.png", buffer);
            }

        }

    });

    // Done
    fs.close(fd);

});

当我输出output.png文件时,其文件大小与我的输入相同(因此必须使用某种东西?),我的图像查看器无法读取文件,因此它在某种程度上已损坏。

我尽量保持这个问题和示例尽可能简单,但如果重要或提示进一步的建议,这是我的核心目标:

  • 以固定块大小(128KB)
  • 读取文件
  • 加密并存储mongodb中的每个块(此处有意排除)
  • 稍后可以重新组装图像

感谢您提供的任何帮助。


更新 找到了答案,这很简单。

我复制的代码有一个小错误,即fs.close()

该流在被阅读之前正在关闭。

当我向我的fs.read添加一个回调时,这也是可见的,它有一个'错误的'第一个参数:

[Error: EBADF, read] errno: 9, code: 'EBADF'

1 个答案:

答案 0 :(得分:0)

尝试更改行

while (bytesRead < bufferSize)

while (bytesRead < bufferSize && !isFinal)

我不知道是否会解决这个问题,但这是一个开始。

另外,为了提高效率,您不需要以下部分:

} else {
    isFinal = false;
}

因为isFinal无论如何都是假的(你永远不会在这行中改变它)。