4

問題の履歴:
現在、Windows Media Player SDK 9を使用して、デスクトップアプリケーションでAVIファイルを再生しています。Windows XPでは問題なく動作しますが、Windows 7で実行しようとすると、エラーが発生しました。再生直後にAVIファイルを削除できません。問題は、開いているファイルハンドルが存在することです。Windows XPでは、ファイルの再生中に2つのファイルハンドルを開いており、再生ウィンドウを閉じた後に閉じていますが、Windows 7では、ファイルの再生中にすでに4つのハンドルを開いており、そのうち2つは再生ウィンドウを閉じた後も残っています。それらは、アプリケーションを閉じた後にのみ無料になります。

質問:
この問題を解決するにはどうすればよいですか?ハンドルを開いたファイルを削除するにはどうすればよいですか?「強制削除」のようなものが存在する可能性がありますか?

4

4 に答える 4

3

問題は、ファイルのハンドルを取得しているのはあなただけではないということです。他のプロセスやサービスもファイルを開くことができます。したがって、ハンドルを解放するまで削除することはできません。これらのハンドルが開いているときに、ファイルの名前を変更できます。これらのハンドルが開いている間にファイルをコピーできます。ただし、ファイルを別のコンテナに移動できるかどうかわかりませんか?

その他のプロセスとサービス、特に。ウイルス対策、インデックス作成などを含みます。

これは、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;
}
于 2011-01-04T18:52:36.460 に答える
1

MoveFileEx技術的には、を使用して渡すことにより、ロックされたファイルを削除できますMOVEFILE_DELAY_UNTIL_REBOOT。パラメータがNULLの場合lpNewFileName、移動は削除に変わり、ロックされたファイルを削除できます。ただし、これはインストーラーを対象としており、他の問題の中でも、管理者権限が必要です。

于 2011-01-04T18:58:16.360 に答える
0

どのアプリケーションがまだaviファイルを使用しているかを確認しましたか?これは、 handle.exeを使用して実行できます。そのファイルを使用しているプロセスを閉じた後、ファイルの削除/移動を試みることができます。

unlocker別の解決策は、アプリケーション(無料)を使用することです。

上記の2つの方法のいずれかで問題が解決するはずです。

于 2011-01-04T18:49:53.023 に答える
0

代わりにハンドルを解放するようにWMPに依頼しようとしましたか?(IWMPCore :: closeはそれを行うようです)

于 2011-01-04T18:50:06.990 に答える