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

Posted

技术标签:

【中文标题】如何通过覆盖现有符号链接来强制创建符号链接?【英文标题】:How to force a symlink creation by overriding the existing symlink? 【发布时间】:2015-04-23 09:56:45 【问题描述】:

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

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

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

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

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

【问题讨论】:

可能有模块会提供这样的功能,但最终它也会使用你描述的方法(或者“检查存在+删除如果存在+符号链接”)。 我不知道如何在 js 中执行此操作,但在 linux 中您可以覆盖符号链接,因此您可以从 node.js 调用 shell 脚本。来源:serverfault.com/questions/389997/… @robertklep 好吧,当然。我也可以为这个东西创建一个模块,但如果有本地方式,我会很感兴趣。 @vanadium23 我知道我可以使用ln -f,但是我不想。我想使用文件系统api。 @robertklep 好的,所以我构建了一个模块来做这件事。 :) 【参考方案1】:

当使用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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

因为我不知道 POSIX rename() 是这样指定的。+1【参考方案3】:

你可以用 fs easy 做到这一点。之前只需致电fs.remove(target)。如果没有文件 - 它将返回代码 0

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

【讨论】:

以上是关于如何通过覆盖现有符号链接来强制创建符号链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使静态库中的 gcc 链接强符号覆盖弱符号?

如何获取符号链接的目标?

在 Windows 中检索现有符号链接文件夹的目标

强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接

如何将符号链接视为Mercurial中的目录?

如何创建符号链接或硬链接到另一个符号链接?