如何在 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 中读取符号链接的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 中的 Emoji 到 PNG 或 JPG - 如何?