如何重命名文件而不覆盖现有文件?

时间:2018-08-22 11:58:40

标签: node.js fs

让我说我有两个文件:

/1.txt

/2.txt

现在,如果我致电fs.rename('/1.txt', '/2.txt'),它将用2.txt取代1.txt

他们说,这就是重命名在Linux和其他所有操作系统上的工作方式。但是,如果新路径上的文件已经存在,我不想替换。理想情况下,我想为此抛出一些错误,例如EEXIST。据我所知,在重命名之前使用fs.existsSyncfs.stat或其他检查会引入竞争状态。

1 个答案:

答案 0 :(得分:2)

为避免出现竞争状况,您将需要某种锁定机制。

在Linux系统上,使用锁定文件是很标准的-通常,它是一个空文件或目录,用于检查是否按顺序进行了某些操作。与数据库行/表锁定类似,创建和删除锁定文件是原子的,其余操作则不是。

为此,我将使用proper-lockfile软件包和fs-extra中的move

const lockfile = require('proper-lockfile');
const fs = require('fs-extra');

lockfile.lock('some/file')
  .then(() => fs.move('/tmp/file', 'some/file'))
  .finally(() => lockfile.unlock('some/file'));

还请注意,与some/file配合使用的任何逻辑都必须遵守lockfile,否则竞争条件仍然存在。