Node.js `fs.lstat` 和 `fs.readlink` 无法识别 Windows 中的符号链接

问题描述 投票:0回答:1

我正在使用 SMB 访问 Windows 上的 Unraid 共享。 Windows 资源管理器可以跟踪在此共享上找到的符号链接,因此我知道 Windows 上的 SMB 协议在处理符号链接方面并没有完全失败。

然而,Node.js 的

fs.lstat()

isSymbolicLink()
 在调用返回统计数据时总是告诉我错误。 (人们使用 
stat
 而不是 
lstat
 遇到了这个问题,但这不是这里的问题。) 
fs.readlink()
 会导致错误。

我可以向你保证这确实是一个符号链接:

...双击资源管理器中的 007 文件夹可以正确显示链接的目标。

我在 Windows 11 上使用 Node.JS v18.17.1。在 WSL 中使用 Node.js,查看相同的已安装 SMB 共享时,我遇到了同样的问题。 WSL 本身并不将该链接视为链接。

这是某种 Node.js 错误,还是我缺少一些选项或解决方法?

node.js symlink smb
1个回答
0
投票
显然我错误地认为资源管理器以某种方式意识到符号链接并能够使用它们。

发生的事情是,就 Windows 或 SMB 卷的任何使用者而言,指向文件

IS 那个文件的符号链接,以及指向目录 IS 那个目录的符号链接。无法区分链接和该链接的目标。

对我来说幸运的是,我正在编写的代码在 Windows 上进行测试时,在部署时将在 Docker 上的 Linux 环境中运行。出于测试目的,这个丑陋的黑客有帮助:

find . -type l -exec echo {} \; -exec readlink {} \; > symlinks.txt


我在 Unraid 服务器上运行上述命令,在卷的根目录下构建符号链接查找。我没有直接使用

lstat

readlink
,而是通过一个在 Linux 中使用真正的 
lstat
readlink
 的实用程序函数,它将访问 NFS 共享,而不是 SMB,或者,在 Windows 环境中,我使用 
symlinks.txt
 查找文件。

© www.soinside.com 2019 - 2024. All rights reserved.