【问题标题】:Delete a file named "NUL" on Windows在 Windows 上删除名为“NUL”的文件
【发布时间】:2013-07-26 20:22:41
【问题描述】:

我在 Windows 7 上运行了一个在 Cygwin 下编译的程序,并将“NUL”作为输出文件名传递。它实际上在当前目录中创建了一个名为“NUL”的文件,而不是抑制输出。 (显然它需要“/dev/null”,即使在 Windows 上也是如此。)现在我被这个无法删除的“NUL”文件所困扰!

我已经试过了:

  • Windows 资源管理器 - 错误:“无效的 MS-DOS 功能”(是的,它确实是这么说的!)
  • 使用“del NUL”的命令提示符 - 错误:“文件名、目录名或卷 标签语法不正确。”
  • 删除整个目录 - 与删除文件相同
  • remove() 在 C 程序中 - 也失败了

如果没有安装完整的 Cygwin 环境并在 Cygwin 下编译 C 程序来完成,我该如何摆脱这些 NUL 文件(我现在有几个)?

【问题讨论】:

  • 你试过del *.*吗?
  • 更好的是,如何防止它的创建?

标签: c windows null cygwin


【解决方案1】:

尝试编写一个简短的 C 程序,调用 Windows API 来删除该文件。

http://msdn.microsoft.com/en-us/library/aa363915%28v=vs.85%29.aspx

如果这不起作用,请尝试使用 CreateFile() 和 FILE_FLAG_DELETE_ON_CLOSE 打开文件的句柄,然后关闭句柄。

【讨论】:

  • 很确定这会被 Win32 层解释为指的是所谓的“DOS”设备,而不是文件。 (据推测,“DOS”设备实际上不会最终被删除,因为如果这是一件可以偶然完成的事情,那么我很确定这里或superuser.com/questions/282194/…的人会发生这种情况...... )
【解决方案2】:

打开命令提示符并使用这些命令先重命名然后删除 NUL 文件:

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

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

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

【讨论】:

  • 有趣的是,Far Manager 可以毫无问题地删除该文件。也许它在内部无条件地使用了这个技巧。
  • 太好了,谢谢!如果我在完整路径之前使用 \\.\ 前缀,即使直接删除它似乎也有效,例如。 del \\.\C:\Temp\NUL
  • @Јοеу 在我的 Windows 8 Far 上删除/创建名为“nul”的文件时遇到问题,但我使用的是 v1.75 - v3.0 可能添加了该功能。
  • 它对我有用。要记住的重要一点是启动文件路径,例如:\\.\C:\
  • 通常最好使用“\\?\”而不是“\\.\”,因为问号前缀会绕过所有规范化,包括去除尾随空格和点。它将完全传递您在引号中传递的任何名称,例如“\\?\C:\nul.”,而“\\.\C:\nul.”被规范化为“\\.\C:\nul” .
【解决方案3】:

我遇到了类似的问题。它也可能是由 Cygwin 引起的(因为我经常使用它),但我已经忘记了该文件是如何创建的。

我也无法删除它。我遵循了其他一些帖子的建议并尝试启动到安全模式以删除文件,尽管这没有任何作用。 +xxbbcc 的提示对我也不起作用。

但是,我可以使用 Cygwin 终端删除该文件! Cygwin 创造,Cygwin 毁灭。

【讨论】:

  • 如果你有 Cygwin,试试 'rm NUL'。它对我有用。
  • 我遇到了 Jan E. 指出的类似问题,除了我在 Linux (WSL) 上使用 Windows 子系统。 WSL bash 的rm 删除了文件。
【解决方案4】:

我以稍微不同的方式解决了这个问题。

我想我会在此处添加此内容,因为它在 google 搜索结果中的排名很高,并且我在名为 NUL 的 文件夹 中遇到了类似的问题。

我尝试了 rmdir\\?\C:\My\Path\NULrmdir\\.\C:\My\Path\NUL 没有任何成功,还尝试了几个使用我的 SourceTree 安装中的 bash 的命令。不开心。

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

然后在标准命令rmdir /s NUL~1 中使用它,最终解决了这个问题。

【讨论】:

  • 我认为你的情况略有不同,目录的 long name 是“NUL”,但 MSDOS 8.3 名称不是。所以这很有用,但与我刚刚使用 Cygwin 再次测试的原始问题不同。在 cygwin 中运行 mkdir nul 后,dir /x/a 没有显示短名称,因此该文件夹实际上命名为“nul”。 rd \\?\C:\Path\NULrd \\.\C:\Path\NUL 在这种情况下都可以工作。
【解决方案5】:

要删除位于此处的 nul 文件: C:\unix\cygwin\dev\nul

我只是使用(仅在 Windows 10 上测试): 德尔\?\C:\unix\cygwin\dev\NUL

【讨论】:

    【解决方案6】:

    如果您安装了适用于 Windows 的 Git (v2.18),请执行以下操作

    1. 打开包含要删除的文件的目录
    2. 左键单击并选择Git Bash Here
    3. 在命令提示符下键入 rm nul.json 并按 ENTER,现在应该删除该文件。

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

    【讨论】:

    • 这解决了一个不同的问题。 OP 正在尝试删除一个名为“NUL”的文件,它是 Windows 中的关键字。
    • 我的例子也适用于名为 NUL 的文件(我确认)
    • 感谢这完美地解决了我的问题!正如 Zack 所说,这解决了一个不同的问题,但似乎直接在我这里用谷歌搜索。
    • 这个解决方案对我有用,似乎 windows CMD 无法从一个解释中删除文件,我发现 win32 工具无法访问这个文件 - 所以 git bash 和使用 rm 是一个很好的解决方案。
    【解决方案7】:

    如果你在 Windows 上有 git,只需右键单击包含 nul 文件的文件夹 -> 在此处转到 gitbash -> 并根据文件类型键入“rm nul”或“rm nul.json”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多