Git-Bash for Windows 'rm' 是如何工作的?

How does Git-Bash for Windows 'rm' work?

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

为什么?

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

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

资源管理器删除:"The action cannot be completed because the file is open."

命令:del <path>:"Access is denied"

PS: Remove-Item -Force -Path <path> : "Cannot remove item. Access to the path is denied."

C++ remove() : returns -1

C++ unlink() : returns -1

C++ _unlink() : returns -1

git-bash rm <path> : 成功

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

还有其他被git-bash rm删除成功的锁定文件(我过去用过,最近没用过,我没有其他具体的示例)。

但是它并不总是有效:在测试应用程序中,我使用 fopen() 和 none 方法打开了一个文本文件,包括 Git-Bash rm,删除成功

那么,Git-Bash rm 是如何工作的?

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

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

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

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

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