在Windows上删除名为“NUL”的文件

86

我在Windows 7上运行了一个在Cygwin下编译的程序,并将“NUL”作为输出文件名传递给了它。但是,它没有抑制输出,而是在当前目录下创建了一个名为“NUL”的文件。(显然,即使在Windows上,它也期望“/dev/null”存在。)现在,我卡在了这个“NUL”文件上,无法删除!

我已经尝试过:

  • Windows Explorer - 错误:“无效的MS-DOS函数”(是的,它真的是这么说的!)
  • 使用命令提示符“del NUL” - 错误:“文件名、目录名或卷标语法不正确。”
  • 删除整个目录-与仅删除文件相同
  • 在C程序中使用remove() - 同样失败

除了安装完整的Cygwin环境并在Cygwin下编译一个程序来删除它们之外,我该如何摆脱这些NUL文件(我现在有好几个)?


你试过 del *.* 吗? - chqrlie
1
更好的方法是,如何防止它的创建? - Dragos Bandur
据我所知,在Windows中,NUL具有特殊含义。如果它是在Cygwin环境中创建的,也应该可以在那里删除,即通过执行rm NUL来实现。顺便说一下:在Windows shell(Powershell或者Batchfile中),/dev/null不能用于表示这种情况下的“黑洞”。当然,Cygwin程序能够理解/dev/null - user1934428
9个回答

196

打开命令提示符,使用以下命令来重命名并删除NUL文件:

C:\> rename \\.\C:\..\NUL. deletefile.txt
C:\> del deletefile.txt

使用\\.\前缀告诉高级文件I/O函数将文件名未经解析地传递给设备驱动程序-这样您就可以访问其他无效的名称。

请阅读此文章,了解Windows中有效的文件/路径名称以及各种保留名称。


2
有趣的是,Far Manager 可以毫无问题地删除那个文件。也许它在内部无条件地使用了那个技巧。 - Joey
20
太好了,谢谢!如果我在完整路径前使用 \.\ 前缀,直接删除似乎也可以正常工作,例如:del \.\C:\Temp\NUL。 - EM0
2
它对我有效。记住的重要事情是要像这样开始文件路径:\.\C:\ - revolutionary
2
一般来说,最好使用“\?\”而不是“\.\”,因为问号前缀可以绕过所有规范化,包括剥离尾随空格和点。它将完全传递您在引号中传递的任何名称,例如“\?\C:\nul. ”,而“\.\C:\nul.”会被规范化为“\.\C:\nul”。 - Eryk Sun
1
只是一条注释:如果NUL文件的路径包含空格,则需要将其放在引号中,包括前缀,即:del "\.\C:\path\that\contains\a space character\NUL"。 - PGlivi
显示剩余11条评论

39
如果您已经安装了Git for Windows (v2.18),请按照以下步骤操作:
  1. 打开包含您想要删除的文件的目录。
  2. 左键单击并选择 Git Bash Here
  3. 在命令提示符下键入rm nul.json并按ENTER,在此之后该文件应被删除。

run Git Bash Here

注意:这些截图显示的是删除文件nul.topo.json的过程,它是另一个无法通过简单删除来删除的文件。

after command execution


3
这解决了一个不同的问题。OP试图删除一个名为“NUL”的文件,这是Windows中的一个关键字。 - Zack
3
我的例子也适用于文件名为NUL的情况(我已经确认过)。 - Geovani Martinez
谢谢,这完美地解决了我的问题!正如Zack所说,这解决了一个不同的问题,但似乎是谷歌直接将我带到这里。 - Brian
这个解决方案对我很有效,似乎Windows CMD无法删除该文件,根据我找到的一个解释,Win32工具无法访问此文件 - 因此,使用Git Bash并使用rm是一个不错的解决方案。 - Lupin

8
如果你在Windows上安装了Git,只需右键单击包含“ nul”文件的文件夹 -> 转到GitBash -> 然后根据文件类型输入“rm nul”或“rm nul.json”。

4
我遇到了类似的问题,很可能是由于我经常使用的Cygwin(因为它),但是我已经忘记了这个文件是如何创建的。
我也有删除它的麻烦。我按照其他帖子的建议尝试进入安全模式来删除文件,但是这没有任何作用。+xxbbcc的提示对我也没用。
然而,我能够使用Cygwin终端删除该文件! Cygwin创造和Cygwin销毁。

9
如果您已经安装了Cygwin,只需尝试使用命令' rm NUL '即可。这对我有效。 - Jan Ehrhardt
2
我遇到了与Jan E.提到的类似的问题,只不过我使用的是Linux上的Windows子系统(WSL)。 WSL bash的rm命令删除了该文件。 - Bill Hoag
我使用MobaXterm在Windows 10上运行bash命令,只需执行rm nul就可以完美地工作。我认为这也适用于其他SSH/FTP客户端,如PuTTY和WinSCP。 - BGranato

2

要删除位于这里的nul文件: C:\unix\cygwin\dev\nul

我只需使用以下命令(仅在Windows 10上测试过): Del \?\C:\unix\cygwin\dev\NUL


1

我用了稍微不同的方法解决了这个问题。

我想把这个方法写在这里,因为它在谷歌搜索结果中排名很高,并且我遇到了一个名为 NUL 的文件夹的类似问题。

我尝试过使用 rmdir\\?\C:\My\Path\NULrmdir\\.\C:\My\Path\NUL,但都没有成功,还尝试了从我的 SourceTree 安装中使用 bash 的多个命令。但是都没有成功。

最后,我使用了来自 cmd 的 DIR /X /A 命令来列出父目录中的短名称。这向我展示了我的 NUL 文件夹的 NUL~1,并确定了问题的关键所在。

然后,我将其用于标准命令 rmdir /s NUL~1 中,最终解决了问题。


我认为你的情况略有不同,目录的长名称为“NUL”,但MSDOS 8.3名称不是。所以这很有用,但与我的原始问题不同,我刚刚使用Cygwin进行了测试。在Cygwin中运行mkdir nul后,dir /x/a不显示短名称,因此文件夹的实际名称为“nul”。在这种情况下,rd \\?\C:\Path\NULrd \\.\C:\Path\NUL都可以工作。 - EM0

1

我遇到了同样的问题。
如果您已经安装了WSL2,只需进入该目录并运行以下命令:

rm -f nul

在我的情况下,文件名是小写的。你应该没问题。


0
C:>重命名\。\C:..\NUL. deletefile.txt C:>删除 deletefile.txt
这个来自用户xxbbcc的命令还不错,但是评论更有用。只想指出,这个命令对我没有帮助,但是一个叫Eryk Sun的人给出的提示很有用:
一般来说,最好使用"\?"而不是"\.",因为问号前缀可以绕过所有的规范化,包括去除尾部的空格和点号。
所以最好的命令应该是:
rename "\\?\C:\..\<broken filename>" deletefile.txt
del deletefile.txt

或者它甚至可以更短一些:
del "\\?\C:\..\<broken filename>"

-2

1
相信Win32层会将其解释为所谓的“DOS”设备,而不是文件。(假定,“DOS”设备实际上不会被删除,因为如果这是一个可以意外发生的事情,那么我相信在这里或https://superuser.com/questions/282194/how-do-i-remove-a-file-named-nul-on-windows参与的某个人一定已经遇到过...) - SamB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接