Главная страница
    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.035 c
1-1083227723
senya
2004-04-29 12:35
2004.05.16
PDF не понимает русский язык, выдает "иероглифы"


7-1081419272
Aleksandr
2004-04-08 14:14
2004.05.16
Как запустить из программы виндовый Dial-Up с заданным именем сое


1-1083727727
russko
2004-05-05 07:28
2004.05.16
Многоуровневый выпадающий список


7-1081155835
Azazzello
2004-04-05 13:03
2004.05.16
Как узнать сводобное место на диске.


1-1083688521
Влад Сташневский
2004-05-04 20:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский