fs.renameSync是一个可以防止损坏的原子操作吗


const path = require('path');
const fs = require('fs');
const os = require('os');
const from_dir = path.resolve(os.homedir(), './from_dir');
const to_dir= path.resolve(os.homedir(), './new_dir');
fs.renameSync(from_dir, to_dir);

假设我在NodeJS应用程序中有以下代码片段,并且我的目标是重命名";from_dir";至";to_dir";。根据我的理解,重命名操作应该是原子操作。我还可以依靠这个操作来永远不破坏";from_dir";重命名过程中的目录内容,即使在?还是先将目录的内容复制到备份中,然后尝试重命名(相当于cp -r ~/from_dir ~/from_dir_backup(更好?我试图重现这样的场景,但没能做到

在后台,fs中的renamerenameSync函数调用它们的底层对应函数:rename系统调用。该系统调用只更新指向目录inode的名称,但不会更改正在移动的目录的内容。

您可以自己验证这一点:在开始时检查目录的inode编号(使用stat命令(,执行fs.renameSync,然后检查目标的inode号。它们是相同的,这意味着目录不是从头开始重新创建的,而是在其内容不变的情况下重命名的。

现在,POSIX不要求操作本身是原子性的——事实上,Linux手册页(man 2 rename(在关于原子性的主题上有这样的说法:

如果newpath已经存在,它将被原子替换,这样其他试图访问newpath的进程就不会发现它丢失。但是,可能会有一个窗口,其中oldpath和newpath都引用了正在重命名的文件。

我不确定目录是否可能出现这种情况(2个链接(,因为我从未能够创建到一个目录的超过1个硬链接,但手册页似乎很令人放心,因为目录不会消失或被取消链接。

相关内容

  • 没有找到相关文章

最新更新