如何在 Node.js 中读取符号链接

Posted

技术标签:

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

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

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

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

【问题讨论】:

希望我的回答对您有所帮助,我不确定您为什么要在 windows / linux 上阅读原始链接文件。 【参考方案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 资源管理器一起使用,而不是实际链接。他告诉我使用命令行来创建真正的链接,然后一切都应该按预期工作,它确实如此。它应该是透明的,

以上是关于如何在 Node.js 中读取符号链接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nodemon 监控符号链接模块?

如何让 Apache 读取到不同分区的符号链接?

Node.js 中的 Emoji 到 PNG 或 JPG - 如何?

Node.js UnhandledPromiseRejection:TypeError:无法读取未定义的属性“符号”

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

创建损坏的符号链接