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

时间:2016-07-12 06:30:02

标签: node.js fs

我有一个文件,有时会在其中包含\00个空字符。所以我需要修理它。

这就是为什么我正在阅读它,删除无效字符并再次写入。但是,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('\00')) + str.slice(str.lastIndexOf('\00') + 1, str.length);
    //console.log(repaired);
    fs.writeFile('./' + file, repaired, function (err) {
        if (err)
            console.error(err);
    });
});

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

2 个答案:

答案 0 :(得分:1)

感谢@ thefourtheye让我指向正确的方向。

由于我正在测试的文件中没有\00字符,str.indexOf('\00')并且正在获取整个文件,并且str.slice(str.lastIndexOf('\00')再次获取整个文件。这就是我想的原因

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

var repaired = str.replace(/\00/g,'');

答案 1 :(得分:0)

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

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

建议的解决方案是“等待回调”。我认为这意味着“在尝试读取文件之前等待调用写回调”。这当然是有道理的,您不应该尝试阅读尚未完全编写的内容。

但是,如果您像我一样多次写入同一个文件,那么在读取之前等待(第一次)写入回调完成是不够的。为什么?因为在读取时可能正在进行另一次“写入”,因此可能会出现乱码。