如何通过覆盖现有符号链接来强制创建符号链接?

How to force a symlink creation by overriding the existing symlink?

我使用 fs 模块创建符号链接。

fs.symlink("target", "path/to/symlink", function (e) {
   if (e) { ... }
});

如果 path/to/symlink 已经存在,将在回调中发送错误。

如何强制创建符号链接并覆盖现有的符号链接?

除了check error + delete existing symlink + try again还有其他选择吗?

当使用 ln 命令行工具时,我们可以使用 -f(强制)标志

ln -sf target symlink-name

但是,除非我们在模块中实现此功能,否则使用 fs API 是不可能的。

我创建了 lnf - 一个覆盖现有符号链接的模块。

// Dependencies
var Lnf = require("lnf");

// Create the symlink
Lnf.sync("foo", __dirname + "/baz");

// Override it
Lnf("bar", __dirname + "/baz", function (err) {
    console.log(err || "Overriden the baz symlink.");
});

Read the full documentation on the GitHub repository

您可以创建具有不同(唯一)名称的临时符号链接,然后重命名它。

使用fs.symlinkSync(path, tempName)然后fs.rename(tempName, name)

当其他应用程序依赖于它的存在时(并且可能在删除但尚未重新创建时意外访问它)时,这可能比删除文件更好。

你可以用 fs 轻松做到这一点。之前调用fs.remove(target)就可以了。如果没有文件 - 它将 return 代码 0

await fs.remove("path/to/symlink");
await fs.symlink("target", "path/to/symlink", function (e) {
   if (e) { ... }
});