1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| program clean_project_list;
// compiler avec 'fpc clean_project_list'
uses
Classes, SysUtils;
procedure log(s: string);
begin WriteLn(s); end;
var
CHEMIN_ET_FICHIER: string;
sl: TStringList;
i: integer;
posegale: integer; // position du signe "=" dans la ligne
validline: integer; // pointeur/compteur de ligne(s)
ligne: string;
prod: boolean;
begin
// à exécuter en dehors de l'EDI sinon, à sa fermeture, il va récrire
// les valeurs (fausses !) qu'il a chargées à son ouverture...
// /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\
prod := True; // aussi utilisé tout en bas
// prod := False; // aussi utilisé tout en bas
if prod
then CHEMIN_ET_FICHIER := 'votre_chemin_environmentoptions.xml' // POUR LA VRAIE VIE /!\
else CHEMIN_ET_FICHIER := 'autre_chemin_environmentoptions.xml'; // POUR TESTS /!\
sl := TStringList.create;
sl.LoadFromFile(CHEMIN_ET_FICHIER);
//- à priori on dirait qu'il n'y a pas de doublons dans la liste,
//-1- : donc parcourir la liste à l'envers pour enlever les "not found"
i := sl.Count-1;
while i > 0 do begin
if copy(sl[i], 7, 15) = '</ProjectFiles>' then begin
//log(sl[i]);
repeat
dec(i);
//log(sl[i]); ok ligne complète
posegale := Pos('=', sl[i]);
//log(sl[i]+inttostr(posegale)); // 21 pour item1..item9, 22 au-delà
if not FileExists(copy(sl[i], posegale+2, length(sl[i])-posegale-4)) then
begin
//log(copy(sl[i], posegale+2, length(sl[i])-posegale-4)+'°°°not found'); ok
sl.Delete(i);
end;
until copy(sl[i-1], 7, 13) = '<ProjectFiles';
Break;
end else dec(i);
//log(inttostr(i)+'***'); ok
end;
//log(inttostr(i)+'------'); ok
//log(inttostr(sl.Count)+'------'); //ok
//-2- : puis parcourir à l'endroit ce qui reste pour renuméroter les ItemXX
i := -1;
validline := 0;
while i < sl.Count-1 do begin
inc(i);
if copy(sl[i], 7, 13) = '<ProjectFiles' then begin
//log(sl[i]); // ok
repeat
inc(i);
inc(validline); // utilisé aussi pour compteur de lignes
posegale := Pos('=', sl[i]);
//log(copy(sl[i], posegale+2, length(sl[i])-posegale-4));// -4 pour "/> OK
// ligne à récrire
ligne := ' <Item'+IntToStr(validline) + ' Value="'
+ copy(sl[i],posegale+2,length(sl[i])-posegale-4) + '"/>'; //log(ligne); // ok
sl[i] := ligne; //log(sl[i]); //ok ligne complète
until copy(sl[i+1], 7, 15) = '</ProjectFiles>';
Break;
end;
end;
//memo(inttostr(validline)+'------'); //ok
//-3- : mettre à jour la ligne "ProjectFiles" avec validline
// <ProjectFiles Max="30" Count="30">
i := i - validline; //log(sl[i]); ok
if copy(sl[i], 7, 13) = '<ProjectFiles' then // test de sécurité, juste au cas où...
begin // on est sur la bonne ligne
posegale := Pos('Count="', sl[i])-1;
// reconstruction de la ligne "ProjectFiles"
ligne := copy(sl[i],1,posegale+length('Count="'))+IntToStr(validline)+'">';
//log(ligne); // ok
sl[i] := ligne; //log(sl[i]); //ok
end;
log('Nouveau nombre de projets : ' + IntToStr(validline));
//-4- : normalement c'est fini, alors enregistrer.
if prod
then sl.SaveToFile(CHEMIN_ET_FICHIER)
else sl.SaveToFile(CHEMIN_ET_FICHIER+'mod'); // par sécurité
sl.Free; // ménage et fin
Halt; // stop program loop
end. |
Partager