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

时间:2010-09-21 19:00:23

标签: c++ qt file-io windows-7 windows-media-player

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

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

4 个答案:

答案 0 :(得分:3)

问题是你并不是唯一一个获取文件句柄的人。其他进程和服务也可以打开该文件。所以删除它是不可能的,直到他们释放他们的句柄。您可以在这些句柄打开时重命名该文件。您可以在这些句柄打开时复制文件。但是,不确定是否可以将文件移动到另一个容器?<​​/ p>

其他流程&amp;服务尤其包括防病毒,索引等。

这是我在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;
}

答案 1 :(得分:1)

从技术上讲,您可以使用MoveFileEx删除锁定的文件并传入MOVEFILE_DELAY_UNTIL_REBOOT。当lpNewFileName参数为NULL时,Move将变为删除并可以删除锁定的文件。但是,这适用于安装程序,除其他问题外,还需要管理员权限。

答案 2 :(得分:0)

您是否检查过哪个应用程序仍在使用avi文件? 您可以使用handle.exe执行此操作。关闭正在/正在使用该文件的进程后,您可以尝试删除/移动文件。

另一种解决方案是使用unlocker appliation(免费)。

上述两种方法之一应该可以解决您的问题。

答案 3 :(得分:0)

您是否已经尝试过请求WMP释放句柄? (IWMPCore::close似乎这样做)