Skip to content

[Bug] 资源管理器未处理软链接:指向目录的软链接显示为文件且无法展开 #65

Description

@NolanHo

问题描述

右侧「资源管理器」对软链接(symlink)完全没有处理:

  • 指向目录的软链接被显示成文件图标(无展开箭头),无法像 VSCode 那样直接展开浏览;
  • 点击这类链接会走「打开文件」流程,fs.read 实际读到的是目录,编辑器打开报错(Linux/macOS 下为 EISDIR: illegal operation on a directory, read);
  • 指向文件的软链接可以正常打开内容,但没有任何视觉标识,无法区分真身与链接;
  • 指向不存在目标的悬空软链接也被当作普通文件展示,点击后报 ENOENT

复现步骤

  1. 在会话 cwd(资源管理器根目录)下执行:

    mkdir -p /tmp/some-real-dir && echo hi > /tmp/some-real-dir/a.txt
    ln -s /tmp/some-real-dir link-to-dir
    ln -s /does/not/exist broken-link
  2. 打开侧边栏「资源管理器」:link-to-dir 显示为文件图标,没有展开箭头;

  3. 点击 link-to-dir:编辑器尝试按文件打开,报 EISDIR 错误。

原因定位

src/fs-tree.tslistDirectory() 只用 dirent.isDirectory() 判断目录:

isDir: dirent.isDirectory(),

opendir 返回的 Dirent.isDirectory() 不会跟随软链接,因此指向目录的软链接得到 isDir: false,在 src/client/ExplorerView.tsx 中直接落入文件分支(onOpenFile(entry.path))。当前代码库中没有任何 isSymbolicLink / lstat / realpath 相关处理。

期望行为(参考 VSCode)

  • 指向目录的软链接:按目录展示并可展开,建议带链接标识(如箭头角标);
  • 指向文件的软链接:正常打开,建议加链接标识;
  • 悬空软链接:显示失效/错误标识,而不是静默当作普通文件;
  • (可选)右键菜单增加「复制真实路径」。

环境

  • 插件版本:0.12.0(cba7e778
  • 平台:Linux(任何支持 symlink 的平台均可复现)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions