Можно ли удалить файл, который открывается процессом под окнами? - PullRequest
2 голосов
/ 01 декабря 2010

В целях тестирования и моделирования я хотел бы удалить файл, который в данный момент открыт моим процессом.

Документы CreateFile указывают, что можно открыть файл в режиме (FILE_SHARE_DELETE), который позволяет файлу, на который указывает дескриптор открытия, быть удаленным другой операцией. (И я уже попробовал и подтвердил это через CreateFile (FILE_SHARE_DELETE) + DeleteFile.)

Что я хотел бы знать сейчас, так это то, возможно ли вообще, чтобы файл, открытый кем-либо без вышеуказанного флага, был каким-либо образом удален?

Насколько я понимаю, DeleteFile docs было бы невозможно с этими функциями, так как

Функция DeleteFile завершается ошибкой, если приложение пытается удалить открытый файл для обычного ввода-вывода или в виде файла с отображением в памяти.

Есть ли другой способ удалить файл, который открыт, но не имеет установленного флага FILE_SHARE_DELETE?

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

Нет способа сделать это.

Ближайший способ сделать что-то подобное - запланировать удаление при перезагрузке, используя MoveFileEx с целевым именем файла NULL и MOVEFILE_DELAY_UNTIL_REBOOT в параметре dwFlags.

2 голосов
/ 01 декабря 2010

Я не думаю, что есть законный способ удалить такой файл.Однако, если вы хотите быть пуленепробиваемым, помните, что есть инструменты, которые могут закрыть ваш дескриптор извне, а затем файл можно легко удалить ( Process Explorer - один из таких инструментовно есть другие ).Если кто-то закроет дескриптор файла, который вы открыли, вы получите ошибку при попытке использовать этот дескриптор.

0 голосов
/ 01 декабря 2010

Вы можете посмотреть DeleteFileTransacted , это позволяет пометить файл для удаления при закрытии. Но это не подходит вам, если вы хотите немедленно удалить файл. Если файл не имеет флага FILE_SHARE_DELETE, сначала необходимо закрыть его, но для этого вам нужно получить дескриптор файла, а затем закрыть его. Но это требует использования методов внедрения кода. Я не знаю, как это можно сделать проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...