Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Код на оценку. Update INI-файлов   Найти похожие ветки 

 
Андрей Сенченко ©   (2004-04-26 16:10) [0]

Изначально задача выглядит в обновлении программ с сервера по пользовательстким машинам. Обновление exe, dll и прочего решена простым запуском программы - обновлялки, которая втупую копирует обновленные файлы с сервера на локалку.
INI-шки так обновлять по-идее нельзя, потому сбиваются чисто пользовательские настройки ( размеры окон, цвета элементов, размеры колонок etc ), хранимые в INI-шках, попадающих под обновление.

Для выборочного обновления написан нижепреведенный код.
Хотелось бы услышать :
1. Оценку собственно кода, может где чего можно проще написать.
2. Ваше мнение по поводу корректности обновления INI-файлов исключительно с помощью метода TIniFile.WriteString(). Корректно ли это или стоит написать анализатор значений ?


procedure UpdateIniFile(OldFileName,NewFileName : string );
var
 IniSecOld,IniSecNew,IniParOld,IniParNew,IniValOld,IniValNew : TStringList;
 IniFileOld,IniFileNew : TIniFile;
 CountSec, CountParNew, CountParOld, CountVal : integer;
 ParExists : boolean;

begin
 IniFileNew := TIniFile.Create(NewFileName);
 IniFileOld := TIniFile.Create(OldFileName);

 IniSecNew := TStringList.Create;
 IniSecOld := TStringList.Create;

 IniFileNew.ReadSections(IniSecNew);
 IniFileOld.ReadSections(IniSecOld);

 // Побежали по секциям нового ИНИ

 For CountSec := 0 to IniSecNew.Count-1 do
 begin
   If IniFileOld.SectionExists(IniSecNew.Strings[CountSec])
   then
     begin
     // Секция уже существует
       IniParOld := TStringList.Create;
       IniParNew := TStringList.Create;
       IniValOld := TStringList.Create;
       IniValNew := TStringList.Create;

       // Считываем содержимое секций
       IniFileNew.ReadSection(IniSecNew.Strings[CountSec],IniParNew);
       IniFileOld.ReadSection(IniSecNew.Strings[CountSec],IniParOld);
       IniFileNew.ReadSectionValues(IniSecNew.Strings[CountSec],IniValNew);
       IniFileOld.ReadSectionValues(IniSecNew.Strings[CountSec],IniValOld);

       For CountParNew := 0 to IniParNew.Count - 1 do
         Begin
           ParExists := false;
           For CountParOld := 0 to IniParOld.Count - 1 do
             If IniParNew.Strings[CountParNew] = IniParOld.Strings[CountParOld]
             then
               begin
                 ParExists := true;
                 Break;
               end;

           If ParExists = true
           then
             begin
             // Если есть такой параметр в старой инихе - просто заменяем.
             // Сделано на случай встроить выбор - обновлять или нет существующие.
               IniFileOld.WriteString(IniSecNew.Strings[CountSec]
                                     ,IniParNew.Strings[CountParNew]
                                     ,copy(IniValNew.Strings[CountParNew],pos("=",IniValNew.Strings[CountParNew])+1,length(IniValNew.Strings[CountParNew])-po s("=",IniValNew.Strings[CountParNew]))
                                     )
             end
           else
             begin
             // Нет такого параметра в старой. Пишем туда новый.
               IniFileOld.WriteString(IniSecNew.Strings[CountSec]
                                     ,IniParNew.Strings[CountParNew]
                                     ,copy(IniValNew.Strings[CountParNew],pos("=",IniValNew.Strings[CountParNew])+1,length(IniValNew.Strings[CountParNew])-po s("=",IniValNew.Strings[CountParNew]))
                                     )

             end;
         End;

       IniParOld.Free;
       IniParNew.Free;
       IniValOld.Free;
       IniValNew.Free;
     end
   else
     begin
     // Секция не существует

       IniValNew := TStringList.Create;
       IniFileNew.ReadSectionValues(IniSecNew.Strings[CountSec],IniValNew);

       // Пишем секцию старый в ИНИ-файл
       For CountVal := 0 to IniValNew.Count-1 do
         begin
           IniFileOld.WriteString(IniSecNew.Strings[CountSec]
                                 ,copy(IniValNew.Strings[CountVal],0,pos("=",IniValNew.Strings[CountVal])-1)
                                 ,copy(IniValNew.Strings[CountVal],pos("=",IniValNew.Strings[CountVal])+1,length(IniValNew.Strings[CountVal])-pos("=",Ini ValNew.Strings[CountVal]))
                                 )
         end;
       IniValNew.Free;
     end;
 end;

 IniSecNew.Free;
 IniSecOld.Free;
 IniFileNew.Free;
 IniFileOld.Free;
end;


 
Гаврила   (2004-04-26 16:19) [1]

Оценка кода - твердый трояк(по пятибальной системе)


 
panov ©   (2004-04-26 16:33) [2]

Андрей, вопрос - что будет, если в старом файлк есть параметр, а в новом его нет?


 
Андрей Сенченко ©   (2004-04-26 16:55) [3]

Гаврила   (26.04.04 16:19) [1]

Хотелось бы все-же услышать комментарии - что не так, почему, что можно сделать иначе. Просто "трояк" мне ничего не скажет.

panov ©   (26.04.04 16:33) [2]

И нехай стоит. Предполагается вообще выкладывать на сеть не ВЕСЬ новый INI-файл, а только обновления. Ну распухнут коиентские ИНИ-шки на пяток-другой устаревших секций, не страшно - собственно программы то новые уже туда не полезут.



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.054 c
14-1082970834
Инкогнито
2004-04-26 13:13
2004.05.16
Проясните, пожалуйста


14-1083088242
vic_vm
2004-04-27 21:50
2004.05.16
Хорошие англоязычные сайты по Delphi


1-1083232105
Vadim S_
2004-04-29 13:48
2004.05.16
array of char --> String


6-1080627168
paul_k
2004-03-30 10:12
2004.05.16
Помогите разобратся с получением текста из TWebBrowser


1-1083526543
TechnoDreamer
2004-05-02 23:35
2004.05.16
Проблема с раскладкой клавиатуры