Как я могу принудительно удалить заблокированные файлы в C#

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

единственное решение, которое приходит мне в голову - это использовать интерфейс командной строки http://www.emptyloop.com/unlocker/.

MoveFileEx Это не вариант, так как я не могу перезагрузить машину.

Есть ли еще C#ish метод / библиотека для этого?

я не в восторге от использования консольного приложения API

в случае, если это неясно. Я знаю риск и мне не нужна лекция о том, почему это плохая практика. если вы знаете, как сделать то, что я просил. Большое спасибо!

если вы хотите прочитать лекцию, почему это плохо - просто не ищите кого-то еще

2 ответа

Решение

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

Я полагаю, что эти разблокировщики обнаруживают процесс и пытаются заставить его разблокировать блокировку тем или иным способом (возможно, даже закрывая свой процесс).
Хотя это может работать для большинства приложений, некоторые будут более агрессивными (например, сканеры вирусов).

Поэтому, возможно, вам нужно спросить себя, хотите ли вы повысить свои шансы на получение блокировки или вам нужно быть абсолютно уверенным в получении блокировки.

Редактировать:
Предполагая, что вы можете прервать процесс блокировки, и вы действительно хотите очистить эти файлы (независимо от последствий), вы можете найти процесс, который удерживает блокировку, и закрыть ее. В этом потоке они дают несколько решений для отслеживания того, какой процесс удерживает блокировку (в коде C#) с помощью дескриптора, win32 dll или даже плана.NET кода.

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

Я не могу дать вам решение, но могу указать вам направление.

Обозреватель процессов в Windows имеет функцию, которая может заставить вас искать дескрипторы:введите описание изображения здесь

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

Поэтому в основном вам нужно выяснить, какие вызовы API использует Process Explorer, и выполнить их самостоятельно в вашем приложении.

Другие вопросы по тегам