Удаление заблокированной папки или файла

Пытаюсь удалить папку и при удалении выскакивает окошко и в нем текст:

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

Пробовал через функцию KillTask. Но она убивает сам процесс (то есть закрывает файл что держит папку) а мне нужно просто освободить папку от того процесса что не дает её удалить (Но не убивать сам процесс что держит папку). И после уже удалить эту папку.

Вот эта функция не подходит:

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Может кто подскажет простой вариант на Delphi ?


Ответы (1 шт):

Автор решения: Azmandios

В 2 нажатия такое вы не сделаете, это на уровне самой системы реализованно данное поведение. Когда файл открыт, его держит поток программы которая с ним работает.

Unloker так же не всегда может удалить файл, если его занимает системный процесс, то предлагается удалить с перезагрузкой.

Почему такой функционал недоступен ? Все объяснимо: это ведёт к нарушению логики работы программ.

На крайний случай, напишите скрипт для закрытия ПО, удаления всех временных файлов и запуска процесса обратно(bat). Либо сделайте очистку кэша перед закрытием или запуском своего ПО.

→ Ссылка