【问题标题】:nodejs read file, write to temporary file then copy and replace the original filenodejs读取文件,写入临时文件然后复制并替换原始文件
【发布时间】:2018-03-18 23:42:07
【问题描述】:

我正在尝试读取文件,然后创建一个临时文件,然后将临时文件复制并替换为最后的原始文件。

是否可以做到以下几点?

// read the original file then save it to temporary file
fs.readFile(originalPath, function (err, data) {
            var json = JSON.parse(data);
            json.items.push("sample item");
            fs.writeFileSync(tmpPath, JSON.stringify(json))
})

// copy the temporary file to the original file path
fs.readFile(tmpPath, (err, contents) => {
            var json = JSON.parse(contents);
            fs.writeFileSync(originalPath, JSON.stringify(json));
});

我这样做是为了防止在该过程完成之前对原始文件进行更改。

由于文件在读取时没有物理保存,它似乎不起作用。

谢谢。

【问题讨论】:

    标签: javascript node.js file


    【解决方案1】:

    我不确定我是否遵循了您从该短代码 sn-p 中尝试执行的所有操作,但您可能会在像这样混合异步文件读取和同步文件写入时遇到一些麻烦。

    如果这两行在你写的时候一个接一个地运行,第二个readFile 不会看到由它上面的writeFileSync 创建的输出——tmpPath 文件不会是写到还没有。

    【讨论】:

    • 谢谢。这就是我面临的问题。处理这个问题的正确方法是什么?
    • 您可以采用多种方法,最接近于坚持使用已有代码的方法是将第二个 readFile 移到第一个 readFile 的回调中,就在 writeFileSync 之后。跨度>
    • 谢谢。我想我之前弄错了,它通过将第二个 readFile 移到第一个来工作。
    【解决方案2】:

    使用像普通代码一样流动的async/await承诺比使用回调更容易解释复制/编辑/替换。

    fs 提供了一个promise API

    const fsp = require('fs').promises
    

    然后代码可以通过使用await 用于任何异步任务从上到下流动。

    // read the original file then save it to temporary file
    async function modifyFile(originalPath, tmpPath, item){
      const data = await fsp.readFile(originalPath)
    
      const json = JSON.parse(data)
      json.items.push(item)
    
      // Save it
      await fsp.writeFile(tmpPath, JSON.stringify(json))
      await fsp.renameFile(tmpPath, originalPath)
    }
    
    modifyFile('orig.json', 'orig.json.tmp', 'new item').catch(console.error)
    

    请注意,async/await 是 ES2017,需要 Node.js 7.6+ 或像 Babel 这样的编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多