问题历史记录:
现在,我使用 Windows Media Player SDK 9 在我的桌面应用程序中播放AVI文件。它在Windows XP上运行良好,但当我尝试在Windows 7上运行 时发现错误 - 我无法在播放后立即删除AVI文件。问题是存在打开的文件句柄。在Windows XP上,我在播放文件中有2个打开的文件句柄,它们在关闭播放窗口后关闭但在Windows 7上我在播放文件期间已经有4个打开的句柄,其中2个在关闭播放窗口后仍然存在。只有在关闭申请后,它们才会免费。
问题:
我怎么解决这个问题? 如何删除已打开句柄的文件?可能存在类似“强制删除”的内容?
答案 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似乎这样做)