如何通过覆盖现有符号链接来强制创建符号链接?
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) ...
);
【讨论】:
以上是关于如何通过覆盖现有符号链接来强制创建符号链接?的主要内容,如果未能解决你的问题,请参考以下文章