让我说我有两个文件:
/1.txt
/2.txt
现在,如果我致电fs.rename('/1.txt', '/2.txt')
,它将用2.txt
取代1.txt
。
他们说,这就是重命名在Linux和其他所有操作系统上的工作方式。但是,如果新路径上的文件已经存在,我不想替换。理想情况下,我想为此抛出一些错误,例如EEXIST
。据我所知,在重命名之前使用fs.existsSync
,fs.stat
或其他检查会引入竞争状态。
答案 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
,否则竞争条件仍然存在。