apa*_*urn 8 c++ powershell git-bash
在某些情况下,rmGit-Bash中的命令会删除在资源管理器,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文件中找到了删除例程,该文件试图以几种不同的方式删除文件。
最终,它尝试将文件移动到回收站,在该处通过使用Windows驱动程序调用带有FILE_DELETE_ON_CLOSE标志的NtOpenFile()打开文件,然后使用NtClose()关闭它来删除锁定的文件。
不知道将CygWin的代码复制到此处是否合适,但是可以在提供的链接中找到上述所有内容的详细信息。
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |