как закрыть все FileStreams, связанные с конкретным файлом? - PullRequest
1 голос
/ 03 ноября 2010

У меня есть поток файлов:

tempOutputStream = new FileStream(sTempFileName, FileMode.OpenOrCreate, 
    FileAccess.ReadWrite, FileShare.ReadWrite);

После создания файла вы можете создавать дополнительные FileStreams для чтения / записи tempOutputStream. Есть ли способ закрыть все из них, не имея ссылки на каждый поток объекта? Или, по крайней мере, для первого, создающего поток.

проблема в том, что я хочу удалить файл, но один из потоков не закрыт, поэтому я получил исключение в File.Delete ...

Спасибо.

С уважением, Леонид

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Одно из возможных решений:

  • расширить класс FileStream или создать деривацию Stream
  • в нем, добавить метод что-то вроде GetNewStream()
  • этот метод может вернуть новый поток и записать его ссылку на некоторый внутренний List<Stream>
  • переопределить Close() и Close() каждый поток из списка
  • переопределить Dispose() и Dispose() каждый поток из списка

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

Еще один, для предотвращения жесткого рефакторинга:

  • я предполагаю, что в вашем коде есть что-то вроде Stream s=originalStream.GetStream(); (я не знаю наизусть, как дублируется поток ...)
  • создать синглтон, который будет содержать Map<Stream, list<Stream>> и несколько методов:
    • RegisterStreamChild(Stream Parent, Stream Child);
    • CloseAllChildSteams(Stream Parent)
  • реализовать эти методы, используя карту <>, содержащуюся в синглтоне
  • поиск в вашем коде случаев дублирования потока. Используйте первый метод для регистрации нового потока
  • поиск в вашем коде случаев закрытия потока. Используйте второй метод, чтобы закрыть все дочерние потоки
1 голос
/ 03 ноября 2010

Нет, нет.

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

...