2009-09-15 2 views
2

Я пишу настольное приложение под Windows в C++ MFC.Как удалить файл, который заблокирован?

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

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

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

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

ответ

7

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

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

+2

Не совсем верно, что если процесс не открыт, то он не заблокирован. В нескольких нечетных случаях Windows не может потерять блокировку. Это очень редкий вопрос, но я видел, как это случалось несколько раз, даже когда-то под Win 7. Однако не было разработано, как его воссоздать.Однако, похоже, это случается только при авариях. – Goz

+0

Когда произойдет синий экран, эта блокировка может произойти – user25749

+1

Я был бы очень удивлен, если вы обнаружите ошибку, когда блокировка выживает при закрытии и завершении процесса. Если вы это сделаете, это основная ошибка в операционной системе. Чтобы сделать это утверждение, вам нужно исключить ошибку в коде. Может ли ручка сохраниться в другом процессе? Неужели процесс действительно умер, или отладчик сохраняет его в живых? Что означает «авария» в этом контексте? Учитывая, что вы не можете воспроизвести его, я очень скептически отношусь к утверждению, что это ошибка операционной системы. – janm

0

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

Вместо этого я бы работал вокруг этого с чем-то вроде этого.

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

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

3

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

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

+0

Плохая идея закрыть ручки в другом процессе. Процесс, которому принадлежит обработчик, не знает, что он был закрыт, значение может быть повторно использовано, и тогда могут возникнуть всевозможные странные проблемы. – janm

+0

Если вы собираетесь это сделать, вы должны просто прекратить процесс, открыв ручку. По крайней мере, так, что вещи останавливаются, а не терпят неудачу неожиданными способами. – janm

+0

Да. Если «crashed» означает «terminated», тогда нет необходимости закрывать дескриптор в другом процессе, потому что процесс исчез. Если «crashed» означает «не делать передовой процесс», то правильная вещь, которую нужно сделать, это прекратить процесс и прекратить его открытые дескрипторы с ним. Закрытие рукоятки в другом процессе без его ведома не является правильным. – janm

0

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

0

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

Он помог мне открыть мой счет Skype на Windows 8, будучи в состоянии удалить «% AppData%/Skype/мой пользователь-профиль» в то время как другие инструменты и процедуры не помогло в моем случае (ссылка на «еще один экземпляр skype может существовать», который также укусил многих других пользователей).

Смежные вопросы