c++ - 适用于 Windows 'rm' 的 Git-Bash 如何工作?

标签 c++ powershell git-bash

在某些情况下,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/

相关文章:

git - 无法克隆 Gerrit 存储库

c++ - 如何在模板参数中使用 >(大于)而不出现解析错误?

c++ - 如何在 VSCode C++ 扩展中启用 C++17 支持

c++ - 不在包含路径中搜索

c# - 如何创建 C# 异步 powershell 方法?

powershell - 将 Remove-Item 与凭据一起使用

git bash 配置问题

git - Git for Windows/WSL2/VS Code 的非常奇怪的问题

c++ - 尝试在 GMock 代码中使用 WithArg;错误说它不存在

powershell - 如何在Powershell中转置数据