Как удалить файл, который открыл дескрипторы?

ИСТОРИЯ ПРОБЛЕМЫ:
Сейчас пользуюсьWindows Media Player SDK 9 для воспроизведения файлов AVI в моем настольном приложении. Это хорошо работает на Windows XP, но когда я пытаюсь запустить егов Windows 7 Я поймал ошибку -Я не могу удалить файл AVI сразу после воспроизведения, Проблема в том, что существуют открытые файловые дескрипторы. В Windows XP у меня есть 2 открытых дескриптора файла во время воспроизведения файла, и они закрываются после закрытия окна воспроизведения, но в Windows 7 у меня уже есть 4 открытых дескриптора во время воспроизведения файла, и 2 из них остаются после закрытия окна воспроизведения. Они становятся бесплатными только после закрытия приложения.

ВОПРОС:
Как я могу решить эту проблему?Как удалить файл, который открыл дескрипторы? Может быть, существует что-то вроде «принудительного удаления»?

Ответы на вопрос(4)

IWMPCore :: близко вроде бы так и делает)

Решение Вопроса

что вы не единственный, кто получает дескрипторы вашего файла. Другие процессы и службы также могут открыть файл. Таким образом, удаление невозможно, пока они не освободят свои ручки. Вы можете переименовать файл, когда эти дескрипторы открыты. Вы можете скопировать файл, когда эти ручки открыты. Однако не уверены, что можете переместить файл в другой контейнер?

Другие процессы и услуги, особенно в том числе антивирус, индексация и т. д.

Вот функция, которую я написал, чтобы выполнить «Немедленное удаление» под 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;
}
 SKINDER13 янв. 2011 г., 12:33
Но если эти файлы (видеофайлы!) Слишком велики, а их объем слишком велик, при использовании этой стратегии у меня будет нехватка свободного места - временные файлы сожрали бы мое дисковое пространство. Я загружаю файл, играю его и удаляю много раз.
 Mordachai13 янв. 2011 г., 22:51
Хм - я не думаю, что вы понимаете ситуацию. Вышеупомянутая техника не создает копию файлов - она ​​просто переименовывает их, так что исходный файл мгновенно исчезает. Переименованный файл все равно будет удален точно так же быстро, как и может быть - ни медленнее, ни быстрее. Невозможно заставить операционную систему удалить ее раньше, и, вообще говоря, это задержка в пару секунд (достаточно долго, чтобы антивирусная служба или служба индексирования закрыли свой дескриптор файла и позволили файлу исчезнуть).

какое приложение все еще использует файл avi? Вы можете сделать это с помощьюHandle.exe, Вы можете попробовать удалить / переместить файл после закрытия процесса (ов), которые / используют этот файл.

Альтернативное решение было бы использоватьunlocker приложение (его бесплатно).

Один из двух приведенных выше методов должен решить вашу проблему.

 SKINDER13 янв. 2011 г., 12:24
Я использую COM-интерфейсы для взаимодействия с Windows Media Player, и мне нужно удалить заблокированный файл программным способом.
 Vikram.exe13 янв. 2011 г., 14:08
в этом случае вам придется написать драйвер ядра, который будет проходить по списку дескрипторов открытого файла, затем получать имя процесса-владельца и затем делать все, что вы хотите с этим процессом (из пространства ядра) :)

MoveFileEx и проходя вMOVEFILE_DELAY_UNTIL_REBOOT, КогдаlpNewFileName параметр имеет значение NULL, перемещение превращается в удаление и может удалить заблокированный файл. Однако это предназначено для установщиков и, среди прочего, требует прав администратора.

 SKINDER13 янв. 2011 г., 12:36
Можете ли вы дать доказательство того, что MoveFileEx работает следующим образом: «Move превращается в удаление и может удалить заблокированный файл»?
 Remus Rusanu13 янв. 2011 г., 17:44
В спецификациях функций на MSDN ссылка в моем посте: «Если dwFlags указывает MOVEFILE_DELAY_UNTIL_REBOOT, а lpNewFileName - NULL, MoveFileEx регистрирует файл lpExistingFileName, который будет удален при перезапуске системы. Если lpExistingFileName ссылается на каталог, система удаляет каталог при перезапуске, только если каталог пуст. '

Ваш ответ на вопрос