如何读取 Node.js 中的符号链接
How to read a symlink in Node.js
我想读一个 symlink,并获取 link 本身的详细信息,不是 link 的内容编辑文件。我如何在 Node 中以跨平台的方式做到这一点?
我可以使用 lstat
轻松检测到 symlinks,没问题。一旦我知道文件的路径,并且它是一个 symlink,我该如何读取它? fs.readFile
始终读取目标文件,或将 links 的目录读取到目录时抛出错误。
有一个fs.constants.O_SYMLINK
常数,理论上在OSX上解决了这个问题,但在Ubuntu和Windows上似乎都没有定义10.
如果您确定该文件是一个符号链接,试试这个:
fs.readlink("./mysimlink", function (err, linkString) {
// .. do some error handling here ..
console.log(linkString)
});
已确认正在处理 Linux。
然后您可以使用 fs.realpath()
将其变成完整路径。请注意,尽管 linkString
可以只是文件名或相对路径以及完全限定路径,因此您可能必须为符号链接获取 fs.realpath()
,确定其目录部分并将其前缀为 linkString
在使用 fs.realpath()
之前。
我刚刚遇到了同样的问题:有时 fs.readlink
returns 是相对路径,有时 returns 是绝对路径。
(为了简单起见,未实施正确的错误处理)
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);
如果符号 link 是文件或 directory/folder,则代码有效 - 在 Linux
上测试
我想读一个 symlink,并获取 link 本身的详细信息,不是 link 的内容编辑文件。我如何在 Node 中以跨平台的方式做到这一点?
我可以使用 lstat
轻松检测到 symlinks,没问题。一旦我知道文件的路径,并且它是一个 symlink,我该如何读取它? fs.readFile
始终读取目标文件,或将 links 的目录读取到目录时抛出错误。
有一个fs.constants.O_SYMLINK
常数,理论上在OSX上解决了这个问题,但在Ubuntu和Windows上似乎都没有定义10.
如果您确定该文件是一个符号链接,试试这个:
fs.readlink("./mysimlink", function (err, linkString) {
// .. do some error handling here ..
console.log(linkString)
});
已确认正在处理 Linux。
然后您可以使用 fs.realpath()
将其变成完整路径。请注意,尽管 linkString
可以只是文件名或相对路径以及完全限定路径,因此您可能必须为符号链接获取 fs.realpath()
,确定其目录部分并将其前缀为 linkString
在使用 fs.realpath()
之前。
我刚刚遇到了同样的问题:有时 fs.readlink
returns 是相对路径,有时 returns 是绝对路径。
(为了简单起见,未实施正确的错误处理)
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);
如果符号 link 是文件或 directory/folder,则代码有效 - 在 Linux
上测试