Как удалить файл, когда в него записывается какой-то другой поток? - PullRequest
1 голос
/ 10 декабря 2010

Я получаю IOException всякий раз, когда пытаюсь использовать метод File.Delete для файла, в который пишет какой-то другой поток. У меня нет контроля над темой письма. Так что из моей ветки, как я могу остановить запись файла и удалить файл.

Ответы [ 4 ]

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

Вы не можете;В этом весь смысл блокировки файлов - чтобы предотвратить именно то, что вы предлагаете.

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

Зачем вам это нужно, в любом случае?

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

Какой-то другой поток ? То есть в вашей собственной программе?

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

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

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

Так что ваш процесс должен ждать, пока процесс блокировки не снимет блокировкуили как-то убить процесс блокировки.

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

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

Если вы не имеете никакого контроля над потоком записи, вы не сможете это сделать.

Потенциальная альтернатива - попытаться получить тот же самый дескриптор, который используется для записи. В конце концов, если это поток в вашем приложении, тогда этот дескриптор находится где-то в вашей памяти.

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

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

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