Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу открыть 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 !)


Наверх

Титульная страница Поиск, карта сайта Написать письмо