2013-03-25 2 views
2

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

Если у меня есть следующий "MyFile.xml"

<?xml version="1.0" encoding="utf-8"?> 
<node> 
    <data>this is my data which is long</data> 
</node> 

А затем хотите изменить его в соответствии с этим:

private static void Main(string[] args) 
{ 
    using (FileStream stream = new FileStream("Myfile.xml", FileMode.Open)) 
    { 
     XDocument doc = XDocument.Load(stream); 
     doc.Descendants("data").First().Value = "less data"; 
     stream.Position = 0; 
     doc.Save(stream); 
    } 
} 

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

<?xml version="1.0" encoding="utf-8"?> 
<node> 
    <data>less data</data> 
</node>/node> 

Я предполагаю, что я мог бы использовать File.ReadAll* и File.WriteAll*, но это будет означать два отверстия файла. Разве нет способа сказать «Я хочу открыть этот файл, прочитать его данные и когда я сохраню удаление старого контента», не закрывая и не открывая файл? Другие найденные мной решения включают FileMode.Truncate, но это означает, что я не могу прочитать контент.

+1

Помогает ли этот метод: http://msdn.microsoft.com/en-us/library/system.io.filestream.setlength.aspx? – Vitaliy

+1

дубликат http://stackoverflow.com/questions/8464261/filestream-and-streamwriter-how-to-truncate-the-remainder-of-the-file-after-wr? – Lanorkin

ответ

3

Вы должны будете использовать FileStream.SetLength так:

stream.SetLength(stream.Position); 

После вы закончили писать.
Конечно, предполагая, что позиция находится в конце записанных данных.

+0

Вот и все. Это метод, который я ищу. Благодаря! (будет приниматься после истечения срока) – Default

+0

Я думаю, вы должны сделать то, что Томтом предложил ниже. –

+0

@MatthewWatson Это будет работать для его конкретного случая. Мое решение охватывает более широкий спектр случаев. – Vercas

2

Почему вы сначала читали файл в filestream?

Вы можете сделать следующее:

private static void Main(string[] args] 
{ 
    string path = "MyFile.xml"; 
    XDocument doc = XDocument.Load(path); 
    // Check if the root-Node is not null and other validation-stuff 
    doc.Descendants("data").First().Value = "less data"; 
    doc.Save(path); 
} 

Проблема с потоком в том, что вы можете читать или писать.

Я читал, что с .net-Framework 4.5 можно также читать и писать по потоку, но еще не пробовал.

Смежные вопросы