【问题标题】:How to trigger error on fs.rename command if file already exists?如果文件已经存在,如何在 fs.rename 命令上触发错误?
【发布时间】:2015-06-18 18:14:55
【问题描述】:

我有以下代码将文件从一个目录移动到另一个目录:

var fs = require('fs'),
    oldPath = 'firstfile.txt',
    newPath = 'temp/firstfile.txt';

fs.rename(oldPath, newPath, function (err) {
    console.log('rename callback ', err); 
});

如果newPath文件已经存在,是否可以触发错误?

【问题讨论】:

  • 为什么不先检查它是否存在?
  • 我想用一个操作来实现
  • @TristanFoureur 因为这会引入竞争条件 - 可以在 OP 调用 .stat 以检查是否存在和调用 .rename 之间创建文件(或从另一个进程重命名) .这就是为什么 .exists 在文档中不被鼓励并且在新版本中被弃用的部分原因。
  • @BenjaminGruenbaum 是的,这是真的,但是你建议什么解决方案?除了在检查之前使用强制锁定文件挂载并锁定目标路径外,我没有看到 100% 竞争条件证明的问题。
  • @Erik 我们可以假设旧路径和新路径都在同一个挂载的文件系统上吗?

标签: node.js file-rename fs


【解决方案1】:

试试下面这段代码:

它调用.exists 方法检查路径是否存在

var fs = require('fs'),
    oldPath = 'firstfile.txt',
    newPath = 'temp/firstfile.txt';

fs.exists(newPath, function(exists){
 if (!exists) {
   fs.rename(oldPath, newPath, function (err) {
     console.log('rename callback ', err); 
   });
 } else {
   console.log('The File Already exists');
 }
});

【讨论】:

    【解决方案2】:

    确实,您需要在一条指令中执行此操作以避免竞争条件(如 cmets 中所述)。

    据我所知,核心 fs 库无法做到这一点,但 the extended version 中有一个函数可以做到这一点。

    查看 move 函数,其默认行为不允许覆盖文件:

    https://github.com/jprichardson/node-fs-extra/blob/master/docs/move.md

    const fs = require('fs-extra')
    
    fs.move('/tmp/somefile', '/tmp/does/not/exist/yet/somefile', err => {
      if (err) return console.error(err)
    
      console.log('success!')
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 2015-06-14
      • 2023-04-06
      • 2013-09-29
      • 1970-01-01
      • 2018-08-02
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多