Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Код на оценку. 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.039 c
3-1082654306
ИМХО
2004-04-22 21:18
2004.05.16
Как создать базу данных Access через ADO?


9-1072382293
lucky
2003-12-25 22:58
2004.05.16
Помогите плз сделать 3d врыв в DelphiX.


8-1077984929
Spartak
2004-02-28 19:15
2004.05.16
TMediaPlayer


8-1077816064
evrey
2004-02-26 20:21
2004.05.16
Получение цвета пикселя в изображении.


6-1080543470
Sodom
2004-03-29 10:57
2004.05.16
Upload файла на сервер через PHP-скрипт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский