在某些情况下,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>:success
可以在不同的文件上重复执行上述操作。
还有其他锁定的文件,git rm也成功地删除了它(我过去使用过它,最近没有,也没有其他具体的例子)。
但是,它并不总是有效的:在一个测试应用程序中,我使用fopen()打开了一个文本文件,没有一个方法(包括Git-Bash rm )能够成功地删除它。
那么,Git-Bash rm是如何工作的?
发布于 2018-02-08 18:12:01
我弄明白了这是怎么回事。
有趣的是,我在它的rm命令上使用了Git-Bash的strace实用程序。
结果是Git使用CygWin,在CygWin syscalls.cc文件中可以找到delete例程,它尝试以几种不同的方式删除文件。
最后,它尝试将文件移动到回收站,在回收站删除锁定的文件,方法是使用带有NtOpenFile标志的Windows FILE_DELETE_ON_CLOSE ()打开它,然后使用NtClose()关闭它。
不确定将CygWin的代码复制到这里的响应中是否合适,但是在提供的链接中可以找到关于上述所有内容的详细信息。
https://stackoverflow.com/questions/48393361
复制相似问题