Как удалить файл, который заблокирован? - PullRequest
2 голосов
/ 15 сентября 2009

Я пишу настольное приложение под Windows на C ++ MFC.

Приложение создает индексный файл и снова и снова записывает в него информацию.

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

Как я могу гарантировать, что смогу удалить файл и создать новый? Я могу убедиться, что никакое другое приложение не открывает файл индекса. Его нельзя удалить только из-за сбоя приложения.

Может ли кто-нибудь помочь?

Ответы [ 5 ]

7 голосов
/ 15 сентября 2009

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

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

3 голосов
/ 15 сентября 2009

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

Чтобы найти сбойное приложение, вы можете использовать технику, описанную в этой статье. Это то, что Process Explorer делает при поиске по дескрипторам файлов с указанным именем.

0 голосов
/ 09 мая 2013

Я могу рекомендовать этот инструмент: http://lockhunter.com/download.htm

Это помогло мне разблокировать учетную запись Skype в Windows 8, удалив «% appdata% / Skype / my-user-profile», в то время как другие инструменты и процедуры не помогли в моем случае (см. «Другой скайп»). Экземпляр может существовать ", который долго кусает многих других пользователей).

0 голосов
/ 15 сентября 2009

Иногда можно переименовать заблокированный файл. Вы, вероятно, должны решить реальную проблему, а не симптом.

0 голосов
/ 15 сентября 2009

Скорее всего, ответ «вы не можете удалить заблокированный файл». ОС не позволит вам.

Вместо этого я бы обойти это с чем-то вроде этого.

  • Проверить существующие индексные файлы, удалить их, если нет блокировок.
  • Создайте новый индексный файл, если взято первое «имя», проверяйте index01 и т. Д., Пока не найдете тот, который не используется, а затем используйте его в качестве индексного файла для выполнения программы.
  • При нормальном выходе очистите ваш индексный файл.

Бонусный кредит: разрешить пользователям «восстанавливать» разбитый индексный файл вместо автоматического их удаления.

...