【问题标题】: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 好的,所以我构建了一个模块来做这件事。 :)

标签: node.js symlink


【解决方案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) { ... }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2012-10-16
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多