代码之家  ›  专栏  ›  技术社区  ›  SKINDER

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

  •  4
  • SKINDER  · 技术社区  · 16 年前

    问题历史:
    现在我用 在我的桌面应用程序中播放AVI文件。它在windowsxp上运行得很好,但是当我尝试运行它时 在Windows 7上 我不能删除播放后立即AVI文件 . 问题是存在打开的文件句柄。在WindowsXP上,我在播放文件时有两个打开的文件句柄,它们在播放窗口关闭后关闭,但在Windows7上,我在播放文件时已经有4个打开的句柄,在播放窗口关闭后仍有2个。它们只有在关闭应用程序后才变为免费。


    我怎样才能解决这个问题? 可能存在类似“强制删除”的情况?

    4 回复  |  直到 12 年前
        1
  •  3
  •   Mordachai    15 年前

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

    其他流程和服务,特别是防病毒、索引等。

    下面是我编写的一个函数,用于在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;
    }
    
        2
  •  1
  •   Remus Rusanu    15 年前

    MoveFileEx 然后传过来 MOVEFILE_DELAY_UNTIL_REBOOT . 当 lpNewFileName 参数为空时,移动将变为删除并可以删除锁定的文件。但是,这是为安装程序设计的,除其他问题外,还需要管理员权限。

        3
  •  0
  •   Vikram.exe    15 年前

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

    另一种解决办法是 unlocker 应用(免费)。

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

        4
  •  0
  •   Roman L    15 年前

    你已经试过让WMP释放句柄了吗?( IWMPCore::close 似乎是这样)