Как принудительно разблокировать файл в C #? - PullRequest
5 голосов
/ 09 февраля 2010

Мне нужно удалить файл. Иногда файл может быть заблокирован, в этом случае я бы хотел его разблокировать и удалить в любом случае.

До сих пор я обнаружил две возможности в исследовании.

System.IO.FileStream.Unlock

и

//unlock file
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool UnlockFile(IntPtr handle, int offsetLow, int offsetHi);`  

Будет ли работать любой из этих двух методов? Если да, не могли бы вы предоставить образец, так как я не заставил ни одного из них работать. Или есть другой лучший способ?

Ответы [ 4 ]

2 голосов
/ 09 февраля 2010

Вы должны использовать отложенные файловые операции, см. Как переместить файлы, которые в данный момент используются (в этом контексте «Переместить» включено удаление).

UnlockFile и его друзья предназначены для операций блокировки области файла, а не для блокировки дескриптора файла, см. Блокировка и разблокировка диапазонов байтов в файлах . Надеюсь, что нет API для разблокировки заблокированного дескриптора файла, который бы делал блокировку довольно полезной ...

1 голос
/ 09 февраля 2010

Я посмотрел вызов System.IO.FileStream.Unlock () в рефлекторе RedGates, и кажется, что он просто вызывает внешний вызов UnlockFile (). Методы один и тот же.

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

0 голосов
/ 22 февраля 2010

Завершено с помощью утилиты PSTools, похоже, работает нормально.

0 голосов
/ 09 февраля 2010

Вы можете попытаться сделать P / Invoke вызов на MoveFileEx и MOVEFILE_DELAY_UNTIL_REBOOT:

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

...