我是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);
//}
所以我的程序只是复制文件,但它仍会改变一些字节。
有什么问题?
答案 0 :(得分:1)
所以我检查了模式,我意识到一些字节不在正确的位置,我猜它应该是因为我正在使用异步写入功能。
我将min-device-width : 1024px
更改为fs.writeFile()
,现在一切正常。
答案 1 :(得分:1)
由于您使用的是异步 IO,您应该一直在等待操作队列,因为同时发生的多个写入最终可能会损坏您的文件。这解释了为什么使用同步 IO 解决了您的问题 - 这样,在前一个写入完成之前无法开始进一步的写入。但是,在异步 API 可用时使用同步 API 是一个糟糕的选择,因为您的程序在写入文件时实际上会被阻止。您应该返回异步并创建一个等待队列。