Форум: "Потрепаться";
Текущий архив: 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