问题的产生

我在 windows 系统中使用 opencode + oh my opencode,智能体在生成项目代码的过程中,在项目目录中生成了一个名为 nul 的文件。

执行 ls 输出:

1
2
3
4
5
6
7
Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
d---- 2026/3/5 0:53 .sisyphus
d---- 2026/3/5 0:06 backend
d---- 2026/3/5 0:39 frontend
-a--- 2026/3/5 0:14 194 nul
-a--- 2026/3/5 0:01 1485 README.md

可以看到目录中存在:

1
nul (194 bytes)

但直接使用 delete 键删除该文件,会 UI 化报错:

1
MS-DOS功能无效

系统显示文件存在,但无法删除。


为什么无法删除

原因是 Windows 的保留设备名机制

在 Windows / DOS 系统中,存在一批特殊设备名:

1
2
3
4
5
6
CON
PRN
AUX
NUL
COM1 - COM9
LPT1 - LPT9

其中:

1
NUL

表示 空设备(Null Device),类似 Linux 的:

1
/dev/null

因此:

  • Windows 会把 nul 当作 设备名
  • 普通文件操作会被 系统拦截

但 Linux / macOS 并没有这个限制,因此某些工具在跨平台运行时可能生成这种文件。


错误的删除操作

在排查过程中尝试过以下操作,但都没有成功删除该文件。

直接删除

1
del nul

结果:

1
Cannot find path

使用 Windows 底层路径删除

1
del \\?\C:\...\nul

该命令理论上可以绕过 DOS 文件名解析,但执行后无反应,仍未成功删除。


正确的删除操作

最终通过 调用 cmd 内核删除文件 成功解决。

执行命令:

1
cmd /c del \\?\C:\...\nul

解释:

  • cmd /c
    调用 cmd.exe 执行命令

  • \\?\
    Windows 底层路径前缀,绕过传统 DOS 文件解析

执行后没有报错。

再次 ls 查看目录显示 nul 文件已经成功删除。


总结

本问题的本质是 Windows 保留设备名导致的文件操作异常

推荐解决方法:

1
cmd /c del \\?\完整路径\nul

总结如下:

  1. Windows 中 nul系统设备名
  2. Linux / macOS 可以创建 nul 文件
  3. Windows 删除时可能失败
  4. 需要使用 底层路径 + cmd 删除
  5. 在跨平台开发时避免生成 nulconaux 等文件名