Главная страница
    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.034 c
7-1081068563
_dEMOn
2004-04-04 12:49
2004.05.16
LPT Порт


14-1082953559
Warrior
2004-04-26 08:25
2004.05.16
WinAPI контролы


1-1083383881
BigLeha
2004-05-01 07:58
2004.05.16
Значки на кнопках


3-1082616575
Ant
2004-04-22 10:49
2004.05.16
BDE


14-1082630020
ASMiD
2004-04-22 14:33
2004.05.16
Маленький празник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский