Git-Bash for Windows' rm'工作?

时间:2018-01-23 02:40:11

标签: c++ powershell git-bash

在某些情况下,Git-Bash中的rm命令会删除在资源管理器,cmd提示符,PowerShell或使用C ++标准库调用时无法删除的文件。

为什么?

这让我感到困惑,因为我知道这里没有魔法,我认为它们都使用相同的Win32 API。

例如,我有数据库快照保持打开状态,无法使用所描述的其他方法删除,但Git-Bash rm已成功删除:

资源管理器删除:"由于文件已打开,无法完成操作。"

cmd:del <path>:&#34;拒绝访问&#34;

PS:Remove-Item -Force -Path <path>:&#34;无法删除项目。拒绝访问该路径。&#34;

C ++ remove():返回-1

C ++ unlink():返回-1

C ++ _unlink():返回-1

git-bash rm <path>成功

以上内容可以在不同文件上重复执行。

还有其他锁定文件,git-bash rm也成功删除了(我过去使用过它,而不是最近,我没有其他具体示例)。

然而,它并不总是有效:在测试应用程序中,我使用fopen()打开了一个文本文件,并且包括Git-Bash rm在内的所有方法都无法成功删除它。 / p>

那么,Git-Bash如何运作?

1 个答案:

答案 0 :(得分:5)

我能够弄清楚它是如何工作的。

有趣的是,我在它的rm命令中使用了Git-Bash的strace实用程序。

事实证明,Git Bash使用了CygWin,并且CygWin syscalls.cc file中的删除例程尝试以几种不同的方式删除文件。

最终它会尝试将文件移动到回收站,在那里它通过使用带有FILE_DELETE_ON_CLOSE标志的Windows驱动程序调用NtOpenFile()打开它来删除锁定的文件,然后使用NtClose()关闭它。

不确定将CygWin的代码复制到响应中是否合适,但有关上述所有内容的详细信息可以在提供的链接中找到。