在某些情况下,Git-Bash中的rm
命令会删除无法在资源管理器,cmd提示符,PowerShell或使用C++标准库调用中删除的文件。
为什么?
这让我感到困惑,因为我知道这里没有魔术,我假设他们都使用相同的Win32 API。
例如,我有数据库快照保持打开状态,无法使用上述其他方法删除,但已通过Git-Bash rm
成功删除:
资源管理器删除:“由于文件已打开,无法完成操作。”
cmd:del <path>
:“访问被拒绝”
PS:Remove-Item -Force -Path <path>
:“无法删除项目。对路径的访问被拒绝。”
C++ remove()
:返回-1
C++ unlink()
:返回-1
C++ _unlink()
:返回-1
git-bash rm <path>
:成功
可以对不同的文件重复执行以上操作。
git-bash rm
还可以成功删除其他锁定的文件(我过去使用过,最近没有用过,并且没有其他具体示例)。
但是,它并不总是有效:在测试应用程序中,我使用fopen()
打开了一个文本文件,并且包括Git-Bash rm
在内的任何方法都无法成功将其删除。
那么,Git-Bash rm如何工作?
最佳答案
我能够弄清楚它是如何工作的。
有趣的是,我在rm
命令上使用了Git-Bash的strace实用程序。
事实证明,Git Bash使用CygWin,并且在CygWin syscalls.cc file中找到了删除例程,该例程尝试以几种不同的方式删除文件。
最终,它尝试将文件移动到回收站,在该处通过使用Windows驱动程序调用NtOpenFile()和FILE_DELETE_ON_CLOSE标志打开该文件,然后使用NtClose()将其关闭,从而删除锁定的文件。
不知道将CygWin的代码复制到此处是否合适,但是可以在提供的链接中找到上述所有内容的详细信息。