【问题标题】:How to read a symlink in Node.js如何在 Node.js 中读取符号链接
【发布时间】:2019-01-24 14:01:00
【问题描述】:

我想读取一个符号链接,并获取链接本身的详细信息,不是链接文件的内容。如何在 Node 中以跨平台的方式做到这一点?

我可以使用lstat 轻松检测符号链接,没问题。一旦我知道文件的路径,并且它是一个符号链接,我该如何阅读它? fs.readFile 总是读取目标文件,或者在读取目录链接到目录时抛出错误。

有一个fs.constants.O_SYMLINK 常量,理论上可以在 OSX 上解决这个问题,但在 Ubuntu 和 Windows 10 上似乎都没有定义。

【问题讨论】:

  • 希望我的回答对您有所帮助,我不确定您为什么要在 windows / linux 上阅读原始链接文件。

标签: javascript node.js filesystems symlink fs


【解决方案1】:

我刚刚遇到了同样的问题:有时fs.readlink 返回一个相对路径,有时它返回一个绝对路径。 (未实施适当的错误处理以保持简单)

const fs = require('fs');
const pathPckg = require('path');

async function getTarLinkOfSymLink(path){
    return new Promise((resolve, reject)=>{
        fs.readlink(path, (err, tarPath)=>{
            if(err){
                console.log(err.message);
                return resolve('');
            }
            const baseSrcPath = pathPckg.dirname(path);
            return resolve( pathPckg.resolve(baseSrcPath, tarPath) );
        });
    });
}

// usage:
const path = '/example/symbolic/link/path';
const tarPath = await getTarLinkOfSymLink(path);

如果符号链接是文件或目录/文件夹,则代码有效 - 在 Linux 上测试

【讨论】:

    【解决方案2】:

    如果您确定该文件是符号链接,请尝试以下操作:

    fs.readlink("./mysimlink", function (err, linkString) { 
             // .. do some error handling here .. 
             console.log(linkString) 
    });
    

    确认在 Linux 上工作。

    然后您可以使用fs.realpath() 将其转换为完整路径。请注意,尽管linkString 可以只是文件名或相对路径以及完全限定路径,因此您可能必须为符号链接获取fs.realpath(),确定其目录部分并将其前缀为linkString,然后再使用@987654326 @就可以了。

    【讨论】:

    • 谢谢!是的,我认为这很完美
    • 关于上面关于首先在符号链接上运行 fs.realpath() 的语句,在我的 Node.js v10.16.0 中,它没有返回符号链接的完整路径。相反,在符号链接上运行 fs.realpath() 会返回到符号链接的 target 的完整路径,而根本不需要运行 fs.readlink()。这对我的目的来说似乎很好,但如果有人想要符号链接的实际完整路径,这似乎是有问题的。这也是 Python 的 os.path.realpath() 上的行为。
    • 在 Windows 上,当我将其指向 .lnk 文件时,我会得到 Error: UNKNOWN: unknown error, readlink
    • @tom 我认为这是一个仅限 linux 的功能。但是,您指向的是带扩展名还是不带扩展名的文件?
    • @Voltaire,我都试过了。我最终用mklink /D 的命令行创建了链接。它的工作方式与当时在 Linux 上的工作方式相同。我的一个对 Windows 非常了解的朋友告诉我,.lnk 文件实际上是存储参数和图标等链接的元数据的文件,因此只能与 Windows 资源管理器一起使用,而不是实际链接。他告诉我使用命令行来创建真正的链接,然后一切都应该按预期工作,它确实如此。它应该是透明的,
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2012-06-22
    • 2012-03-10
    • 2016-03-17
    相关资源
    最近更新 更多