在某些情况下,rm
Git-Bash 中的命令删除无法在资源管理器、cmd 提示符、PowerShell 或使用 C++ 标准库调用中删除的文件。
为什么?
这让我感到困惑,因为我知道这里没有魔法,而且我假设它们都使用相同的 Win32 API。
例如,我的数据库快照保持打开状态,无法使用描述的其他方法删除,但已被 Git-Bash 成功删除 rm
:
Explorer delete:“该操作无法完成,因为文件已打开。”
命令:del <path>
: "访问被拒绝"
附言: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它试图以几种不同的方式删除文件。
最终它会尝试将文件移动到回收站,通过使用带有 FILE_DELETE_ON_CLOSE 标志的 Windows 驱动程序调用 NtOpenFile() 打开它来删除锁定的文件,然后使用 NtClose() 关闭它。
不确定将 CygWin 的代码复制到此处的响应中是否合适,但可以在提供的链接中找到有关上述所有内容的详细信息。
关于c++ - 适用于 Windows 'rm' 的 Git-Bash 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48393361/