Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Actualizar archivo ini con variables (https://www.clubdelphi.com/foros/showthread.php?t=95623)

jars 22-03-2022 19:48:22

Actualizar archivo ini con variables
 
Hola amigos.
Con Delphi 7, como puedo hacer para actualizar algunas variables de un archivo .ini que me vienen informadas desde otra lado.
De antemano no se cual va a ser la sección y las variables a modificar.
Este es el código que estoy utilizando pero no funciona, no da error y no actualiza.
De antemano, gracias

Código Delphi [-]
      sl.Text := lResCU.Content;
      lsection := '';
      lvar := '';
      lvalue := '';
      for i := 0 to sl.Count-1 do
      begin
        if LeftStr(sl[i],1) = '[' then
          lsection := sl[i]
        else
        begin
          lvar := sl.Names[i];
          lvalue := sl.Values[sl.Names[i]];
        end;
        if (lsection <> '') and (lvar <> '') then
        begin
          inifile.WriteString(lsection, lvar, lvalue);
          lvar := '';
          lvalue := '';
        end;
      end;

Neftali [Germán.Estévez] 23-03-2022 11:32:42

Personalmente no he entendido muy bien la explicación. Comentas que no sabes de antemano "cual va a ser la sección y las variables" a modificar (entiendo que quieres decir en diseño).

El código que has puesto tampoco ayuda. Tú debes saber para qué se usan las variables y objetos que ahí aparecen, pero para los demás no son más que letras.
En estos casos (para tí y para los demás) creo que es más sencillo que plantees el trabajo que debes hacer como un procedimiento. Lo independiza del resto de tu código (bueno para tí) y ayuda a los demás a entenderlo, probarlo y modificarlo (bueno para los demás).

Según lo que he entendido (aunque no lo tengo claro), necesitas algo como esto:

Código Delphi [-]
procedure ActualizarVariables(AInifile:TInifile; const ASeccion, AVariable, AValor:string);

Es un ejemplo. Tal vez podría ser algo como est:
Código Delphi [-]
procedure ActualizarVariables(const APathInifile:string; const ASeccion, AVariable, AValor:string);
procedure ActualizarVariables(const APathInifile:string; const ASeccion, AVariable:string; AValor:integer);

Si montas un procedimiento como este, te será fácil usarlo y probarlo y para nosotros también es mucho más sencillo poder probarlo y modificarlo.

jars 23-03-2022 13:32:57

Lo que quise decir es que este es un programa que se ejecuta en cada pc de un call-center para actualizar el archivo .ini que tiene cada una. Esto lo hace levantando un inifile desde el servidor, que contiene las secciones y variables nuevas para ser actualizadas en las pc's. No sirve actualizar un inifile entero porque cada pc tiene variables y secciones particulares. Entonces de antemano no se que secciones y variables va a contener.

sl.Text := lResCU.Content;

Con esta línea de código guardo en un stringlist el contenido del inifile del servidor.
Al recorrer SL voy volcando la sección, las variables y el valor para que una vez que sean distintas de '' actualice en inifile

Espero haber aclarado mi intención.
Gracias

Neftali [Germán.Estévez] 23-03-2022 15:17:25

Cita:

Empezado por jars (Mensaje 546172)
este es un programa que se ejecuta en cada pc de un call-center para actualizar el archivo .ini que tiene cada una.

Cita:

Empezado por jars (Mensaje 546172)
Esto lo hace levantando un inifile desde el servidor, que contiene las secciones y variables nuevas para ser actualizadas en las pc's.

Lo que no entiendo es porqué necesitas utilizar un TStringList si tienes un IniOrigen(Servidor) y un IniDestino(de cada PC).
Lee del primero directamente y crea/actualiza en el segundo.

Tienes un métdo para leer todas las secciones del fichero INI del servidor: ReadSections
Y a partir de ahí puedes conseguir todos los valores de cada sección (obtenida con el método anterior): ReadSectionValues

Por lo que he entendido sólo debes recorrer el INI del servidor y copiar los valores en el INI de cada PC.
Se aplica lo mismo de antes:

Código Delphi [-]
procedure UpdateValues(const APathIniOrigen, APathIniDestino:string);

jars 23-03-2022 16:53:39

El problema no es leer el inifile del servidor, lo que me falla es la actualizacion de los inifile de las pc's
Te pongo un ejemplo:

INIFILE pc (a actualizar)
[seccion1]
var1=1
var2=2
var3=3

[seccion2]
var21=1
var22=2
var23=3

[seccion3]
var31=1
var32=2
var33=3


INIFILE servidor
[seccion2]
var21=500
var23=600

[seccion3]
var31=1000

No es copiar el contenido del servidor en la pc, es actualizar algunas variables.

Casimiro Noteví 23-03-2022 17:18:42

Pon tu código y ¿qué quieres decir con "actualizacion de los inifile de las pc's"?

jars 23-03-2022 17:43:40

Este es el codigo:

Código Delphi [-]
procedure UpdateParamsFile;
var
  sl: TStringList;
  lResCU: TServiceCustomAnswer;
  i: Integer;
  lsection: string;
  lvar, lvalue: string;
begin 
  lResCU.Status := 0;
  lResCU.Content := '';
  // este servicio me devuelve el contenido del inifile del servidor
  lResCU := ARService.FileService_GetContentFile('\MainUpd\ParmsUpdate.ini');
  if lResCU.Status <> 200 then
  begin
    Log('@E cannot get the ParmsUpdate.ini file: %s', [lResCU.Content]);
    ShowMessage('No se puedo obtener el archivo: '+lResCU.Content)
  end else
  begin
    // este es el inifile de las pc's
    inifile := TIniFile.Create('c:\WorkDir\Params.ini');
    sl := TStringList.Create;
    sl.Text := lResCU.Content;
    lsection := '';
    lvar := '';
    lvalue := '';
    for i := 0 to sl.Count-1 do
    begin
      if LeftStr(sl[i],1) = '[' then
        lsection := sl[i]
      else
      begin
        lvar := sl.Names[i];
        lvalue := sl.Values[sl.Names[i]];
      end;
      if (lsection <> '') and (lvar <> '') then
      begin
        inifile.WriteString(lsection, lvar, lvalue); // esta linea no actualiza nada en el inifile
        lvar := '';
        lvalue := '';
      end;
    end;
  end;
  sl.Free;
end;

Neftali [Germán.Estévez] 23-03-2022 18:21:23

Siguiendo lo que te he comentado, con un procedimiento como este:

Código Delphi [-]
procedure UpdateValues(const APathIniOrigen, APathIniDestino:string);
var
  IniServidor, iniPC:TIniFile;
  secciones, valores:TStrings;
  i, j:integer;
begin
  IniServidor := TIniFile.Create(APathIniOrigen);
  iniPC := TIniFile.Create(APathIniDestino);
  secciones := TStringList.Create;
  valores := TStringList.Create;
  try
    // Cargar todas las secciones (nombres)
    IniServidor.ReadSections(Secciones);
    // recorrer las secciones...
    for i := 0 to (secciones.Count - 1) do begin
      // Leer los valores de cada sección
      IniServidor.ReadSectionValues(Secciones[i], valores);
      // recorer los valores de cada seccion
      for j := 0  to (Valores.Count - 1) do begin
        // Para cada valor actualizar con el del Servidor (si no existe lo creará, si existe lo actualiza)
        iniPC.WriteString(Secciones[i], valores.Names[j], valores.ValueFromIndex[j]);
      end;
    end;
    // Actualizar el fichero del PC
    iniPc.UpdateFile;
  finally
    IniServidor.Free;
    IniPC.Free;
  end;
end;

Si lo llamas de la siguiente manera:

Código Delphi [-]
UpdateValues('\MainUpd\ParmsUpdate.ini', 'c:\WorkDir\Params.ini');

El resultado será algo así (que creo que es lo que necesitas):

Código:

[seccion1]
var1=1
var2=2
var3=3

[seccion2]
var21=500
var22=2
var23=600

[seccion3]
var31=1000
var32=2
var33=3


jars 23-03-2022 21:05:36

German, es tal cual lo que necesitaba.
Muchas gracias

Neftali [Germán.Estévez] 24-03-2022 08:31:50

Ya se que a veces cuesta hacerlo desde el inicio, pero una vez que has puesto los ejemplos y has explicado un poco mejor el problema, era fácil de entender y fácil de solucionar.
^\||/^\||/^\||/

Por eso lo engo puesto... :D:D;)



La franja horaria es GMT +2. Ahora son las 11:17:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi