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 中找到有关上述所有内容的详细信息。
在某些情况下,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 中找到有关上述所有内容的详细信息。