如何删除已打开句柄的文件?

2023-12-01

问题历史:
现在我用Windows 媒体播放器 SDK 9在我的桌面应用程序中播放 AVI 文件。它在 Windows XP 上运行良好,但是当我尝试运行它时在 Windows 7 上我发现了一个错误 -我无法在播放后立即删除 AVI 文件。问题是存在打开的文件句柄。在 Windows XP 上,我在播放文件期间有 2 个打开的文件句柄,它们在播放窗口关闭后关闭,但在 Windows 7 上,我在播放文件期间已经有 4 个打开的句柄,其中 2 个在播放窗口关闭后保留。只有在关闭应用程序后它们才会变得免费。

问题:
我怎么解决这个问题?如何删除已打开句柄的文件?可能存在类似“强制删除”之类的东西?


问题是您并不是唯一一个可以处理您的文件的人。其他进程和服务也可以打开该文件。因此,在他们释放句柄之前不可能删除它。您可以在这些句柄打开时重命名该文件。您可以在这些句柄打开时复制文件。但是不确定是否可以将文件移动到另一个容器?

其他流程和服务,尤其是。包括防病毒、索引等。

下面是我写的一个在Windows下完成“立即删除”的函数:

bool DeleteFileNow(const wchar_t * filename)
{
    // don't do anything if the file doesn't exist!
    if (!PathFileExistsW(filename))
        return false;

    // determine the path in which to store the temp filename
    wchar_t path[MAX_PATH];
    wcscpy_s(path, filename);
    PathRemoveFileSpecW(path);

    // generate a guaranteed to be unique temporary filename to house the pending delete
    wchar_t tempname[MAX_PATH];
    if (!GetTempFileNameW(path, L".xX", 0, tempname))
        return false;

    // move the real file to the dummy filename
    if (!MoveFileExW(filename, tempname, MOVEFILE_REPLACE_EXISTING))
    {
        // clean up the temp file
        DeleteFileW(tempname);
        return false;
    }

    // queue the deletion (the OS will delete it when all handles (ours or other processes) close)
    return DeleteFileW(tempname) != FALSE;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除已打开句柄的文件? 的相关文章

随机推荐