![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу открыть 5-мбайтный ини файл с помощью - TMemIniFile [D7, WinXP]
IgorT © (2008-11-18 21:02:00)Есть два ини файла. Один большой, на 38 тыс строк, под 5 мб - старый, и второй, строк на 200 - новый... как переенсти все обновления и новые ключи и секции в старый инишник с нового ?
Вопрос решил с использованием TIniFile, но в таком случае комп очч долго обновляет файл (висит с минутку). Мне посоветовали использовать TMemIniFile . Но почемуто, теперь не могу открыть большой файл, тоесть кажется открываю, вот токо в результате получается вместо старого файла - копия нового (старый файл перезаписывается почемуто без открытыя). Если пробую ето выполнить с маленькими инишниками (на пару строк), то все ок.
Вот мой скрипт :
MyIniFile6 :=TMemIniFile.Create('new.ini');
MyIniFile7:=TMemIniFile.Create('original.ini');
StringList := TStringList.Create;
StringList2 := TStringList.Create;
MyIniFile6.ReadSections(StringList);
for i:=0 to StringList.Count-1 do
begin
MyIniFile6.ReadSectionValues(StringList[i],StringList2);
for m:=0 to StringList2.Count-1 do
begin
MyIniFile7.WriteString(StringList[i],StringList2[m],MyIniFile6.ReadString(String List[i],StringList2[m],'Off'));
end;
end;
MyIniFile7.UpdateFile;
MyIniFile6.Free;
MyIniFile7.Free;
StringList.Clear;
StringList2.Clear;
Пожалуйста, помогите разобраться в чем причина (думаю буффера чтоли мало чтобы загрузить файл, если да то как его увеличить ?).
Anatoly Podgoretsky (2008-11-21 14:45:00) [1]> Германн (21.11.2008 13:35:16) [16]
То есть не ясновидец, а шпион
Германн (2008-11-21 13:35:00) [2]
> Amoeba © (21.11.08 13:23) [15]
>
>
> > Германн © (20.11.08 01:10) [13]
>
>
> > А проблема автора, как выяснилось, заключалась в том,
> что
> > тот 5-метровый файл имел unicod-кодировку.
>
> Как узнал, ясновидец?
>
http://forum.sources.ru/index.php?showtopic=256598&view=showall
Amoeba (2008-11-21 13:23:00) [3]
> Германн © (20.11.08 01:10) [13]
> А проблема автора, как выяснилось, заключалась в том, что
> тот 5-метровый файл имел unicod-кодировку.
Как узнал, ясновидец?
IgorT (2008-11-20 22:02:00) [4]Угу, действительно . Вся проблема заключалась в юникоде. Всем спасибо за поддержку ! Вопрос закрыт.
Германн (2008-11-20 01:10:00) [5]
> Palladin © (19.11.08 18:42) [10]
Там собс-но и не ини-файл. Просто кто-то решил пойти по пути всеми уважаемого Christian Ghisler'a. (Который тоже дельфист :) И реализовать "многоязычность" программы через ини-файлы. Но не учёл, что вышеназванный знал что делает.
А проблема автора, как выяснилось, заключалась в том, что тот 5-метровый файл имел unicod-кодировку.
KilkennyCat (2008-11-20 00:51:00) [6]
> стикер-напоминалка на мониторе в 4-5 листов формата A3
хорошая идея!
надо реализовать.
Германн (2008-11-19 18:49:00) [7]
> IgorT © (19.11.08 18:09) [7]
Ну а что насчет отладчика? Пробовал?
Palladin (2008-11-19 18:42:00) [8]5ти мегабайтный, да даже 100 килобайтный, INI файл - это нонсес, это как стикер-напоминалка на мониторе в 4-5 листов формата A3... если конечно такое случилось, что само по себе дико, нужно свой парсер написать, для доступа к данным... и вообще отказатся от такого вида доступа к таким объемам...
IgorT (2008-11-19 18:30:00) [9]да нет, не 5 гб, просто 5 мб...
Smile (2008-11-19 18:25:00) [10]Не хватает слов, да и кое-чего другого:(
Я, конечно, далеко не профи, но для меня 5 гб ini, какой-то ...
Нет, не буду, не хватает ни слов , ни эмоций
Наверно я слишком стар (типа отстал от реальности)
IgorT (2008-11-19 18:09:00) [11]
> var
> NewIni,OriginalIni:TMemIniFile;
> SectionsList,ValuesList:TStringList;
> Section,Value:string;
> i,j:integer;
> begin
> NewIni :=TMemIniFile.Create('new.ini');
> OriginalIni:=TMemIniFile.Create('original.ini');
> try
> SectionsList:=TStringList.Create;
> ValuesList:= TStringList.Create;
> try
> NewIni.ReadSections(SectionsList);
> for i:=0 to SectionsList.Count-1 do
> begin
> Section:=SectionsList[i];
> NewIni.ReadSectionValues(Section,ValuesList);
> for j:=0 to ValuesList.Count-1 do
> begin
> Value:=ValuesList[j];
> OriginalIni.WriteString(Section,Value,NewIni.ReadString(Section,
> Value,'Off'));
> end;
> end;
> finally
> SectionsList.Free;
> ValuesList.Free;
> end;
> OriginalIni.UpdateFile;
> finally
> NewIni.Free;
> OriginalIni.Free;
> end;
> end;
Все тоже самое... оригинальный файл снова заменился новым... тоесть не стал писать уже в существующий а удалил и написал по новой...
> х.м. Я предлагал несколько другую проверку. if FileExists.
> А твоя проверка с аттрибутом faAnyFile даёт несколько иной
> результат.
>
Ок, поставил ваш вариант, ничего не изменилось...
Slym (2008-11-19 04:55:00) [12]IgorT © (18.11.08 21:02)
MyIniFile6,MyIniFile7,StringList2
Ну и названия...
удобочитаемо никак?
var
NewIni,OriginalIni:TMemIniFile;
SectionsList,ValuesList:TStringList;
Section,Value:string;
i,j:integer;
begin
NewIni :=TMemIniFile.Create('new.ini');
OriginalIni:=TMemIniFile.Create('original.ini');
try
SectionsList:=TStringList.Create;
ValuesList:= TStringList.Create;
try
NewIni.ReadSections(SectionsList);
for i:=0 to SectionsList.Count-1 do
begin
Section:=SectionsList[i];
NewIni.ReadSectionValues(Section,ValuesList);
for j:=0 to ValuesList.Count-1 do
begin
Value:=ValuesList[j];
OriginalIni.WriteString(Section,Value,NewIni.ReadString(Section,Value,'Off'));
end;
end;
finally
SectionsList.Free;
ValuesList.Free;
end;
OriginalIni.UpdateFile;
finally
NewIni.Free;
OriginalIni.Free;
end;
end;
Германн (2008-11-19 02:31:00) [13]
> IgorT © (19.11.08 02:20) [4]
> if (FindFirst(fpatch+'Data\'+blast+'\stringtable.ini',faAnyFile
> ,SearchRec)=0) then
>
х.м. Я предлагал несколько другую проверку.if FileExists. А твоя проверка с аттрибутом faAnyFile даёт несколько иной результат.
IgorT (2008-11-19 02:20:00) [14]
> И всё же поставь проверку if FileExists(Полное_имя_'original.
> ini') then.
if (FindFirst(fpatch+'Data\'+blast+'\stringtable.ini',faAnyFile ,SearchRec)=0) then
begin
MyIniFile6 := TMemIniFile.Create(modpath[k+1]+'stringtableMod.ini');
MyIniFile7 := TMemIniFile.Create(fpatch+'Data\'+blast+'\stringtable.ini');
StringList := TStringList.Create;
StringList2 := TStringList.Create;
MyIniFile6.ReadSections(StringList);
for i:=0 to StringList.Count-1 do
begin
MyIniFile6.ReadSectionValues(StringList[i],StringList2);
for m:=0 to StringList2.Count-1 do
begin
MyIniFile7.WriteString(StringList[i],StringList2[m],MyIniFile6.ReadString(String List[i],StringList2[m],'Off'));
end;
end;
MyIniFile7.UpdateFile;
MyIniFile6.Free;
MyIniFile7.Free;
StringList.Clear;
StringList2.Clear;
end;
Вот, сделал так... все тоже самое...
Германн (2008-11-19 00:24:00) [15]
> IgorT © (18.11.08 21:02)
И всё же поставь проверку if FileExists(Полное_имя_'original.ini') then.
Или лучше пройдись отладчиком с влючённой опцией Use Debug DCU's.
IgorT (2008-11-18 22:06:00) [16]В проге хочу реализовать обслуживания файла языков одной популярной игры... А файл языков как раз етот ини... что нить порекомендуете как лучше сделать ?
Сергей М. (2008-11-18 21:55:00) [17]
> большой, на 38 тыс строк, под 5 мб
Это каким же .. нужно быть, чтобы учудить такой ini !)