【问题标题】:node's fs.writeFile does not overwrite previous contents节点的 fs.writeFile 不会覆盖以前的内容
【发布时间】:2016-07-12 06:30:02
【问题描述】:

我有一个文件,其中有时会包含\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可能已经默认使用了)

【问题讨论】:

  • 如果我没记错的话,只有文件的最后一个字符会丢失。你能验证一下吗?
  • @thefourtheye 是的,我猜它是 \n,它被删除了
  • 那我是对的。正在搜索 \00 的字符串不在文件中。
  • 那又怎样?这有什么关系? \00 有时会出现,有时不会出现。我所做的就是将一些内容写入文件,并附加而不是覆盖
  • 你考虑过使用replace函数吗?

标签: node.js fs


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2019-10-05
      • 2022-01-25
      • 2011-08-29
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多