Страница: 1 |
Страница: 1 |
Вопрос: TreeView и INI-файл
Добавлено: 30.06.06 22:42
Автор вопроса: Abriel
В TreeView во время выполнения формируем определенную структуру, например:
*- Child1
*--- SubChild1
*--- SubChild2
*- Child2
*--- SubChild1
*- Child3
...
В процессе формирования все это записывается в INI-файл в виде, например:
[Root1\Child1]
[Root1\Child1\SubChild1]
[Root1\Child1\SubChild2]
[Root1\Child2]
[Root1\Child2\SubChild1]
[Root1\Child3]
В процессе удаления сразу всей ветви как из TreeView, так и с INI использую рекурсию и API:
Все бы хорошо, да именно секция [Root1\Child1\SubChild2] в данном случае не удаляется почему-то!
Ребят, помогите разобраться! Может есть более разумная альтернатива решения подобной задачи, поскажите (желательно в виде примера на VB 6.0).
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 01.07.06 02:27
Не хотелось бы давать советов в стиле vbnet, но все же...
INI - это именно требование?
Почему не используешь XML?
По теме:
Что возвращает функция WritePrivateProfileString?
Что возвращает GetLastError?
Номер ответа: 2
Автор ответа:
Abriel
Вопросов: 9
Ответов: 12
Профиль | | #2
Добавлено: 01.07.06 03:24
В основном играюсь в VB 6.0 и особо не вникал в XML, который под vbnet подкреплен!
WritePrivateProfileString - ф-ция копирует стринг в файл инициализации и возвр. не нулевое значение.
GetLastError - здесь даже не причем, т.к. ошибки то явной не возникает. Это скорей какой-то мой недочет, вот поэтому я и прошу пояснения...
Почему в INI не удаляется именно последняя поочередно идущая дочерняя ветвь (секция), хотя процедура рекурсии проходит по всем нодам и соответственно должна удалять все секции в INI???
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 01.07.06 03:41
(имхо) Не стоит заниматься ерундой с INI...
было бы на порядок проще и удобнее сериализовать твою коллекцию TreeNodeCollection
лишился бы кучи проблем.. как минимум:
- избавился от рекурсии
- уменьшил количество кода
- увеличил бы быстродействие
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 01.07.06 04:18
Я бы все-ти использовал рекурсию вместе с XMLTextReader вместо сериализации - люблю скорость и минимализм
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 01.07.06 11:45
А вот тут ты ошибаешься.. и ошибаешься по нескольким причинам:
- минимизации кода ты не получишь, поскольку против 3 строк сериализации тебе придется писать ф-ю рекурсивного обхода дерева
- и в скорости будет явный проигрыш. Либо читать сразу весь весь файл и приводить его к типу(в случае сериализации), либо читать его построчно и заполнять дерево. И эта разница во времени станет особенно заметна на больших файлах.. (проверено)
А если, к тому же, вместо XMLTextReader использовать BinaryFormatter, то разница будет более, чем очевидна.. Ибо тот же MS заявляет о том, что в бинарном виде скорость чтения/записи до 80 раз выше чем у XML...
Номер ответа: 6
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #6
Добавлено: 01.07.06 15:11
Нет, не получу, получу минимизация выходящего файла.
Ради интереса посаотри набор свойств TreeNode и какое количество из них реально необходимо.
В скорости у меня в принципе не может быть проигрыша, так как внизу XmlSerializer лежит тот самый XmlTextWriter и XmlTextReader, а возможно даже олее медленный XmlDocument.
Кроме того при сериализации/десериализации будет очень плотно использовать рефлексию поэтому у тебя все будет работать _медлденнее_ причем возможно даже на порядки.
Насчет BinaryFormatter.
Я не разбирался еще с функциональностью этого класса, но если также использует рефлексию (а я в этом уверен), то тут вопрос спорный, без бенчмарка не разобраться.
Номер ответа: 7
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #7
Добавлено: 01.07.06 18:14
2 EROS: ИМХО ты не прав по части скорости. Почему? Ну хотя бы потому что целое всегда тормознее частного, если можно так выразиться. XmlSerializer внутри юзает во-первых, reflection, во-вторых тот же xmltextwriter.
Почему Reflection? Потому что xmlserializer сам не знает о структуре сериализуемых данных и для этого ему приходится разбираться в структуре данных и в специальных атрибутах сериализации.
То есть в нагрузку к тому же xmltextwriter мы добавляем reflection. Так где здесь может появиться выигрыш в скорости?
Если я не прав, то бенчмарк нас рассудит
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 01.07.06 18:16
Сорри за дублирование ответов. До поста Brand'а не дошел, когда из меня полезла истина
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 02.07.06 04:08
Убедили...
Время записи 1000 нодов на HDD, ms
XmlWriter: 11,5171
Единственное, что вызывает сомнения, так это то что в xml я писал лишь 5 основных свойств нода (больше поленился), в то время как BinaryFormatter пишет объект абсолютно полностью... Однако разница в количестве кода весьма и весьма ощутима...
Номер ответа: 10
Автор ответа:
Abriel
Вопросов: 9
Ответов: 12
Профиль | | #10
Добавлено: 02.07.06 15:04
А мне так приятно, что решилась не моя, но не менее важная проблема... В принцыпе сам доковырялся. А вот вышеописанные "баталии" очень даже впечатлили и обучили. Всем спаиб!
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 02.07.06 18:07
)
главный вывод, который ты дожен сделать- это отказаться от INI и использовать NET - технологии!
А юзать XmlWriter или BinaryFormatter - это уже дело личных предпочтений.
Номер ответа: 12
Автор ответа:
Abriel
Вопросов: 9
Ответов: 12
Профиль | | #12
Добавлено: 02.07.06 22:48
Вопросик на засыпку...
Имеется массив со строками, например:
000
000\111
000\111\222
Как можно заполнить TreeView по иерархии этих строк-путей, например:
000
=== 111
======= 222
Имеются только эти строки... Подскажите, плиз!
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 02.07.06 23:28
парсинг строк, рекурсия...
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 02.07.06 23:31
Говорили тебе откажись от INI .. так нет же, не послушался...
А теперь придется тебе эти строки парсить..
Вообщем идея такова(схемотично):
1.Сортируешь этот массив
2.Берешь строчку.. сплитом разбиваешь её в массив
3.Дальше берешь первый элемент массива
- проверяешь, если такой нод у тебя есть, то получаешь на него ссылку, если нет, то добавляешь новый нод
- берешь следующий элемент массива, ссылка на родителя у тебя уже есть, проверяешь его коллекцию Nodes. Если такой нод в этой коллекции есть, то получаешь на него ссылку, если нет, опять новый..
- и так до конца массива...
4. Берешь следующую строчку и все повторяется сначала...