node的fs.writeFile不会覆盖之前的内容

node's fs.writeFile does not overwrite previous contents

我有一个文件,有时会在其中包含 [=12=] 个空字符。所以我需要修复它。

这就是我阅读它的原因,删除无效字符并重新写入。但是,fs.writeFile 并没有覆盖它以前的内容。新内容被追加,这不是我想要的。

是不是因为我的写码在读码里面?

fs.readFile('./' + file, function (err, data) {
    if (err) {
        console.error(err);
        return;
    }
    var str = data.toString();
    var repaired = str.slice(0, str.indexOf('[=11=]')) + str.slice(str.lastIndexOf('[=11=]') + 1, str.length);
    //console.log(repaired);
    fs.writeFile('./' + file, repaired, function (err) {
        if (err)
            console.error(err);
    });
});

我也尝试过使用 {flag:'w'}(我认为 fs.writeFile 可能已经默认)

感谢@thefourtheye 为我指明了正确的方向。

由于我测试的文件中没有 [=11=] 字符,str.indexOf('[=12=]') 获取了整个文件,str.slice(str.lastIndexOf('[=13=]') 再次获取了整个文件。这就是为什么我认为

使用替换功能完成了工作。

var repaired = str.replace(/[=10=]/g,'');

我遇到了相同或类似的问题,因为当我用不同的内容但同一个文件调用 fs.writeFile() 时,如果新内容比现有内容短,那么它不会覆盖所有内容以前的文件内容。

我在以下位置找到了可能发生这种情况的解释和建议的补救措施: https://github.com/nodejs/node-v0.x-archive/issues/4965。 根据那个“这不是一个错误。(或者至少,不是 Node 曾经假装解决过的错误......”

建议的解决方案是“等待回调”。我认为这意味着“在尝试读取文件之前等待调用写回调”。这当然是有道理的,你不应该尝试阅读可能还没有完全写完的东西。

但是,如果您像我一样多次写入同一个文件,那么在读取之前等待(第一次)写入回调完成是不够的。为什么?因为你读的时候可能还有一个'write'正在进行,所以你会得到乱码。