![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
трабла с ИНИ-файлами. [D7, WinXP]
Magic_STI © (2004-07-26 15:44:00)У меня прога создает довольно большой ИНИ-файл (около 1 Мб). Создается вроде нормально. Проверял блокнотом, вся инфа есть. А при чтении количество прочитанных секций оказывается гораздо меньше их реального количества. В чем дело? Может есть какое-то ограничение на размер. Если есть, то как его обойти? Заранее благодарен...
mutabor (2004-07-27 08:39:00) [1]2Magic_STI:
возможно поздно, но все же:а xml нельзя было использовать?
sniknik (2004-07-27 08:22:00) [2]> Из материалов Микрософт, не пишите свыше 8к в реестр, используйте вместо этого файлы, поскольку не помойка
в общий да, лучше не писать, но ничего не мещает собственный организовать. (только разширение reg ему не делать а то по случайному нажатию можно его к общему добавить, а там и так... у меня он 80мег, сейчас ;о)
Magic_STI (2004-07-26 18:05:00) [3]Грустна :-((( Ладненько, попробуем все варианты, которые мне посоветовали. Усим огромный респект. Благодарю за внимание...
Anatoly Podgoretsky (2004-07-26 17:48:00) [4]Magic_STI (26.07.04 17:18) [33]
Ини файл
Секция
Параметр=значение
Храни, подобную структуру можно использовать, но не используй тогда системные операции для работы с ИНИ файлом, поскольку не соответствует спецификации. Никакой гарантии работоспособности, что и наблюдаешь.
Magic_STI (2004-07-26 17:23:00) [5]Точна?
Zelius (2004-07-26 17:20:00) [6]Попробуй TMemIniFile, интерфейс такой же как у TIniFile, но нет его ограничений.
Magic_STI (2004-07-26 17:18:00) [7]Мне просто удобно было хранить данные в файле ИНИ-типа.
Anatoly Podgoretsky (2004-07-26 17:15:00) [8]Magic_STI (26.07.04 17:02) [31]
При чем тогда ини, по определению это файл параметров, как ты из не называй.
Magic_STI (2004-07-26 17:02:00) [9]Еще раз повторяю, это НЕ настройки программы!
Anatoly Podgoretsky (2004-07-26 16:59:00) [10]Из той же справки
Win32-based applications should store initialization information in the registry.
Из материалов Микрософт, не пишите свыше 8к в реестр, используйте вместо этого файлы, поскольку не помойка
Обзорная статья Как хранить настройки программ. http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N146
Magic_STI (2004-07-26 16:53:00) [11]Задача такая:
Существует несколько RTF-файлов. Которые построены по принципу дерева. Т.е. в них имеются заголовки разного размера. Чем больше размер, тем выше узел в конечном дереве. Также в этом файле у некоторых узлов имеется текст, который нужно сохранить. Функция сканирует эти файлики по очереди и выделяет каждый узел в запись, вида
head:string; //имя узла, с учетом родителей
fontsize:integer;//размер шрифта заголовка узла
text:string; //текст узла, если нету, то текст=''
Потом функция записывает эти записи по очереди.
Задача: после чтения файла построить из них дерево, чтобы при выделении какого либо узла, из файла читался его текст, если есть.
В случае с ИНИ все прекрасно работает, но вот такая вот досадная проблема :-(((
Magic_STI (2004-07-26 16:46:00) [12]Пасиб, седня попробую вариант со стримом. А в реестре я хранить данные не могу. Это отдельные файлы, а не настройки программы. Эти файлы нужно перемещать вместе в прогой.
ПсихЪ_дубль (2004-07-26 16:43:00) [13]
> Magic_STI (26.07.04 16:41) [25]
Видимо это тоже какое-то ограничение винды.
Можно нескромный вопрос? Зачем тебе это всё нужно, может быть для твоей задачи есть более элегантный способ её решения.
ПсихЪ_дубль (2004-07-26 16:41:00) [14]Исправление:
procedure SaveMyRec( mr : MyRec; FileName : string );
Magic_STI (2004-07-26 16:41:00) [15]Мне нужно получить имена ВСЕХ секций в файле.
Допустим, я пишу
var
f:tinifile;
sl:tstringlist;
begin
...
f.readsections(sl);
showmessage(inttostr(sl.count));
...
end;
На выходе получаю только 210 секций, хотя в файле их около 1000.
Почему?
sniknik (2004-07-26 16:40:00) [16]замени TIniFile на TRegistryIniFile переделок минимум, а регистр является практически базой данных. мег выдержит без проблем.
KSergey (2004-07-26 16:39:00) [17]> [21] Magic_STI (26.07.04 16:35)
> В нетипизированном файле я в запись вставлял textlen:integer;
> Сохранял текст в строку и заполнял эту textlen:=sizeof(text);
> Но когда читал этот файл, то нифига не получалось. Длина
> строки всегда читалась, как 4.
А проверить, что и писалось всегда 4? И справочку по sizeof? :)
Использовать Length
ПсихЪ_дубль (2004-07-26 16:39:00) [18]Алгоритм примерно следующий:
1. Создаёшь объект класса TFileStream;
ptocedure SaveMyRec( mr : MyRec; FileName : string );
var
fs : TFileStream;
cnt, i : integer;
begin
fs := TFileStream( FileName );
2. Каждую элемент твоей записи сохраняешь через fs (в файл FileName)
// Integer сохраняешь стандартно
fs.WriteBuffer( mr.fontsize, SizeOf( integer ) );
// Строки - хитрожопо
cnt := Length( mr.head );
fs.WriteInt( cnt ); // сохраняем количество символов в тексте
for i := 1 to cnt do // сохраняем каждый символ текста
fs.WriteBuffer( mr.head[i], SizeOf( char ) );
// Ту же фигню проделываем и со вторым текстом
cnt := Length( mr.text );
fs.WriteInt( cnt );
for i := 1 to cnt do
fs.WriteBuffer( mr.text[i], SizeOf( char ) );
fs.Destroy();
end;
Вот и всё. Так ты запишешь одну запись в нужный тебе файл. Для записи нескольких записей выносишь создание и удаление TFileStream в отдельную функцию, а между ними вставляешь цикл. Или как тебе удобнее.
Можно в начале файла ещё записать указатели на необходимые тебе блоки с записью, чтобы быстро обращаться к нужным. И т.д.
Читать по анологии, через тот же самый TFileStream. Объяснять не буду - сам шевели головой.
Работает быстрее, чем всякие там ИНИ-файлы и размер неограничен.
Magic_STI (2004-07-26 16:35:00) [19]В нетипизированном файле я в запись вставлял textlen:integer; Сохранял текст в строку и заполнял эту textlen:=sizeof(text);
Но когда читал этот файл, то нифига не получалось. Длина строки всегда читалась, как 4.
panov (2004-07-26 16:34:00) [20]см.
GetPrivateProfileStruct
WritePrivateProfileStruct