我正在使用 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 错误,还是我缺少一些选项或解决方法?
发生的事情是,就 Windows 或 SMB 卷的任何使用者而言,指向文件
IS 那个文件的符号链接,以及指向目录 IS 那个目录的符号链接。无法区分链接和该链接的目标。
对我来说幸运的是,我正在编写的代码在 Windows 上进行测试时,在部署时将在 Docker 上的 Linux 环境中运行。出于测试目的,这个丑陋的黑客有帮助:
find . -type l -exec echo {} \; -exec readlink {} \; > symlinks.txt
lstat
和
readlink
,而是通过一个在 Linux 中使用真正的
lstat
和
readlink
的实用程序函数,它将访问 NFS 共享,而不是 SMB,或者,在 Windows 环境中,我使用
symlinks.txt
查找文件。