Обрезание потоков

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Duress
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 08.05.2005 (Вс) 0:05

Обрезание потоков

Сообщение Duress » 04.12.2005 (Вс) 15:37

Добрый день. Есть вопрос на засыпку. Может, кто сталкивался.

Есть такая задача:
1. Запись в файл некоторых данных.
2. Допись в этот же файл других аналогичных данных

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

Легче привести пример:

1.
<DocumentElement>
<Table>
<Time>632693092850000000</Time>
<Guid>ff8472e0-51e7-45d8-b1ef-a5de0dc18d26</Guid>
<Type>Event0</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
</DocumentElement>

2. Должно выглядеть так:

<DocumentElement>
<Table>
<Time>632693092850000000</Time>
<Guid>ff8472e0-51e7-45d8-b1ef-a5de0dc18d26</Guid>
<Type>Event0</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
<Table>
<Time>632693092850312500</Time>
<Guid>c1e2ae40-beb0-4d38-961f-dca6e86897d3</Guid>
<Type>Event1</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
</DocumentElement>

На деле:
<DocumentElement>
<Table>
<Time>632693092850000000</Time>
<Guid>ff8472e0-51e7-45d8-b1ef-a5de0dc18d26</Guid>
<Type>Event0</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
</DocumentElement>
<DocumentElement>
<Table>
<Time>632693092850312500</Time>
<Guid>c1e2ae40-beb0-4d38-961f-dca6e86897d3</Guid>
<Type>Event1</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
</DocumentElement>

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

Проблема разбивается на две поменьше:
При дописи в файл удалить завершающий тэг
</DocumentElement>

Это решается несложно путём изменения длинны файла на необходимое количество символов

А вот далее уже загвоздка

Происходит следующее:
<DocumentElement>
<Table>
<Time>632693092850000000</Time>
<Guid>ff8472e0-51e7-45d8-b1ef-a5de0dc18d26</Guid>
<Type>Event0</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
<DocumentElement>
<Table>
<Time>632693092850312500</Time>
<Guid>c1e2ae40-beb0-4d38-961f-dca6e86897d3</Guid>
<Type>Event1</Type>
<Name>OPEN_APPLICATION</Name>
</Table>
</DocumentElement>

Попытки перед записью обработать поток таким образом, чтобы
устранить начальный тэг <DocumentElement> ни к чему не приводят.

Варианты типа Stream.Position=... Не дают результатов.
Streem.Seek(...) тоже по нулям.

В общем, проблемка, я думаю, понятна.
Может, кто уже ломал голову - подскажите.

Можно, конечно, изъять массив байтов, обработать соответствующим образом через CopyArray и т.д., но программа будет работать с большими объёмами данных и все эти копирования приведут к перегруженности системы лишней обработкой данных. Когда всего лишь у потока нужно обрезать начало. Конец режется легко:
Streem.SetLength(...), а вот с началом траблы. Заранее спасибо за проявленную солидарность. Пока!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.12.2005 (Вс) 16:55

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

Duress
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 08.05.2005 (Вс) 0:05

Сообщение Duress » 05.12.2005 (Пн) 0:04

Спасибо большое, но, судя по всему вопрос до конца не понят. Здесь проблема управления потоками ввода вывода.

Kulip@tor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 70
Зарегистрирован: 16.09.2004 (Чт) 20:15
Откуда: Israel

Сообщение Kulip@tor » 08.12.2005 (Чт) 0:28

a po4emu bi ne zapisivat objektom i to 4to ne nujno ostavlyat pustim???
ya imeu v vidu serialization

Duress
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 08.05.2005 (Вс) 0:05

Сообщение Duress » 08.12.2005 (Чт) 14:14

Дело в том, что информация берётся из объекта DataTable.WriteXML
а он пишет все тэги, включая начало и конец. То есть, при дописи в файл, он каждый раз записывается, как с нуля. Поэтому при считывании информации происходит сбой. Не может быть больше одного элемента верхнего уровня. В принципе, я этот вопрос уже решил с помощью наследования класса Stream и перехвата метода Write этого класса, смещения Offset на необходимое количество символов и обрезки конца байтового массива. Но хотелось бы что нибудь поэлегантнее. Запутанный код, даже отлаженный, всегда имеет тенденцию вываливаться в самый неподходящий момент.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.12.2005 (Чт) 17:51

:roll:

Использовать пространство имён System.XML.
Создать объект XML на основе имеющегося текста.
Добавить нодов (в объект, а не в текст).
Сохранить XML изменённого объекта.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList  
cron