NodeJS - 读写文件导致损坏

时间:2017-02-18 07:12:02

标签: node.js

我是NodeJS的新手,我正在使用一个简单的文件编码器。

我计划更改文件的第一个20kb,然后复制剩下的文件。

所以我使用了以下代码,但它改变了文件其余部分的一些字节。

这是我的代码:

var fs = require('fs');
var config = require('./config');


fs.open(config.encodeOutput, 'w', function(err, fw) {
     if(err) {
        console.log(err);
    } else {
        fs.readFile(config.source, function(err, data) {
            var start = 0;
            var buff = readChunk(data, start);
            while(buff.length) {
                if(start < config.encodeSize) {
                    var buffer = makeSomeChanges(buff);

                    writeChunk(fw, buffer);
                } else {
                    writeChunk(fw, buff);
                }

                start += config.ENCODE_BUFFER_SIZE;
                buff = readChunk(data, start);
            }
        });
    }  
});

function readChunk(buffer, start) {
    return buffer.slice(start, start + config.ENCODE_BUFFER_SIZE);
}

function writeChunk(fd, chunk) {
    fs.writeFile(fd, chunk, {encoding: 'binary', flag: 'a'});
}

我打开编码文件并将其与原始文件进行比较。

我甚至评论过这些部分:

//if(start < config.encodeSize) {
//    var buffer = makeSomeChanges(buff);

//    writeChunk(fw, buffer);
//} else {
    writeChunk(fw, buff);
//}

所以我的程序只是复制文件,但它仍会改变一些字节。

有什么问题?

2 个答案:

答案 0 :(得分:1)

所以我检查了模式,我意识到一些字节不在正确的位置,我猜它应该是因为我正在使用异步写入功能。

我将min-device-width : 1024px更改为fs.writeFile(),现在一切正常。

答案 1 :(得分:1)

由于您使用的是异步 IO,您应该一直在等待操作队列,因为同时发生的多个写入最终可能会损坏您的文件。这解释了为什么使用同步 IO 解决了您的问题 - 这样,在前一个写入完成之前无法开始进一步的写入。但是,在异步 API 可用时使用同步 API 是一个糟糕的选择,因为您的程序在写入文件时实际上会被阻止。您应该返回异步并创建一个等待队列。