2013-08-09 3 views
1

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

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(); 

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

ответ

3

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

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

+0

Ах, спасибо. Не знал, что 'stream.Length' имеет сеттер. Попробуй и вернись. –

+0

Свойство 'stream.Length' фактически доступно только для чтения. Вместо этого найден метод 'stream.SetLength (long)'. –