Как удалить файл, который используется в Windows? - PullRequest
1 голос
/ 25 марта 2011

Есть ли способ удалить файл при его использовании какой-либо программой или другим процессом в windows? Я искал и нашел это 2 способами:

1 - использование ключа RunOnce в реестре; Я не собираюсь использовать это, потому что я не хочу ждать перезагрузки Windows или чего-то еще ... предпочитаю делать это вовремя!

2 - используя путь, заявленный на этой странице: http://www.delphipages.com/forum/showthread.php?t=201190 проблема здесь в том, что он полезен в Windows NT, мне нужен способ, который работает на всех Windows!

Спасибо.

Ответы [ 4 ]

4 голосов
/ 25 марта 2011

проблема здесь в том, что он полезен под Windows NT, мне нужен способ, который работает на всех Windowses!

Все современные настольные Windowses (XP, Vista, 7) также являются NT.Вам действительно нужно работать с NT <4 или Win98?Или даже Win CE / Mobile / Phone?Вероятно, нет. </p>

Если вам нужно сразу удалить открытый файл, единственное, что вы можете сделать, это присоединиться к каждому процессу, используя привилегии отладчика, посмотреть, есть ли у него какие-либо открытые дескрипторы в файле, и если да, тозакройте их под ним.Вы можете сделать это вручную, используя, например, Process Explorer.Многие приложения плохо реагируют на закрытие своих файлов;ожидайте, что они исключат, когда они попытаются что-то сделать с мертвым дескриптором.

К сожалению, в Windows нет возможности иметь файлы в стиле Unix, которые могут существовать, прикрепленные к дескриптору файла, независимо от того, хранятся ли они под именем файлана диске.

1 голос
/ 25 марта 2011

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

1 - использовать RunOnce, но вы этого не хотите.
2 - ждать в цикле, пытаясь удалить файл.Псевдокод:

DeleteFile  
Check if you was able to delete or if file still exists.  
if you are able to delete, then exit loop.  

Это лучшее, что вы можете сделать, и что я мог вспомнить.

1 голос
/ 25 марта 2011

Попробуйте MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT. Отложит перемещение или удалит действие до перезагрузки.

Редактировать : Если вы не хотите перезапускать, единственный вариант - закрыть эти маркеры. ProcessExplorer делает это и работает все время, и я не видел ни одного сбоя процесса. См. Больше информации о ручках перечисления в процессе в http://www.codeguru.com/forum/archive/index.php/t-176997.html. Но помните, что вы должны перечислять все процессы в системе и вести себя по-разному в Vista + (вам необходимо повышение)

0 голосов
/ 25 марта 2011

Ваши файлы, скорее всего, заблокированы, потому что какой-то процесс имеет дескриптор, открытый для них. Это самая распространенная причина результата Access denied при удалении или перемещении файла.

Очень тупой способ - закрыть ручку.

Затем Инструмент Handles из SysInternals (вы также можете загрузить исходные коды) может сделать это за вас: я успешно его использую.

Примечание 1. Для его использования необходимы административные привилегии.

Примечание 2: Закрытие дескриптора из другого процесса считается очень грубым и может сделать этот процесс нестабильным.

...