FileStream ReadWrite на C #

У меня открыт FileStream следующим образом:

FileInfo file = new FileInfo(@"C:\Project.xml");
FileStream stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
XmlDocument document = new XmlDocument();
document.Load(stream);

Поток открывается при загрузке файла проекта. Теперь мне нужно иметь возможность перезаписывать его содержимое при сохранении изменений. На данный момент у меня есть ссылка на объект FileStream, который остается открытым, чтобы другие приложения / пользователи не вносили в него изменения.

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

stream.Position = 0;
document.Save(stream);
stream.Close();

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


person Raheel Khan    schedule 09.08.2013    source источник


Ответы (1)


Если новый документ длиннее старого, файл (и поток) автоматически расширится.

В противном случае вы можете обрезать файл, вызвав stream.SetLength().
Вы можете установить для него значение stream.Position, которое указывает, сколько байтов было записано на данный момент.

person SLaks    schedule 09.08.2013
comment
Ах, спасибо. Не знал, что у stream.Length есть сеттер. Попробую и вернусь обратно. - person Raheel Khan; 09.08.2013
comment
Свойство stream.Length фактически доступно только для чтения. Вместо этого нашел метод stream.SetLength(long). - person Raheel Khan; 09.08.2013