filesystem:error 无法删除:Input/output 错误

filesystem:error cannot remove: Input/output error

我正在尝试使用这种方式删除字体文件,

std::filesystem::remove(std::filesystem::path("C:\Windows\Fonts\segmdl2.ttf"));

但这会失败并抛出异常,

filesystem:error cannot remove: Input/output error

异常没有帮助。删除此类文件的正确方法是什么?

更新,

我试图从 Powershell 中删除它,但它抛出以下错误,

del C:\Windows\Fonts\segmdl2.ttf
del : Cannot remove item C:\Windows\Fonts\segmdl2.ttf: Access to the path 'C:\Windows\Fonts\segmdl2.ttf' is denied.
At line:1 char:1
+ del C:\Windows\Fonts\segmdl2.ttf
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\Windows\Fonts\segmdl2.ttf:FileInfo) [Remove-Item], UnauthorizedAcc
   essException
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand

我什至试图直接从字体文件夹中删除它,但出现无法完成的错误,因为另一个应用程序已经在使用该字体。

但我成功地从命令提示符中删除了它。

cmd 是怎么做到的?

我的应用需要达到相同的水平。

发生错误是因为我没有删除文件的权限,在某些情况下是因为文件已被另一个进程打开。

为了解决权限问题,我不得不从命令 promot 中调用以下命令,

takeown /f C:\Windows\Fonts /r /d y
icacls C:\Windows\Fonts /grant administrators:F /t

为了解决文件由另一个进程拥有时的问题,我发现了一个名为 IOBitUnlocker 的应用程序,它能够在不关闭进程的情况下执行此操作,因此我决定深入研究它。

我对 IOBitUnlocker 进行了逆向工程。他们正在使用内核模式驱动程序并使用 KeStackAttachProcess 附加到拥有该文件的进程并解锁它。

我很幸运地找到了一篇完整代码的文章,描述了如何使用这个 API 来解锁文件。

https://www.programmersought.com/article/96107379969/

此方法优越,因为您不必关闭应用程序或重新启动计算机。另外,您必须签署内核模式驱动程序或直接从 BIOS 禁用驱动程序验证。