2011-06-04 34 views
10

Al guardar en un archivo INI, especialmente cuando se define más de una sección, los datos se guardan todos juntos sin líneas entre las secciones.¿Cómo puedo separar las secciones en un archivo INI?

Para fines de edición externa sería útil separar cada sección con un salto de línea, para que sea más fácil ver y editar el archivo INI.

Por ejemplo:

estándar Ini

[GENERAL] 
value1=0 
value2=somestring 
[ADVANCED] 
type=1 
autosave=0 
[OTHER] 
showatstartup=1 

Ini con líneas seperating

[GENERAL] 
value1=0 
value2=somestring 

[ADVANCED] 
type=1 
autosave=0 

[OTHER] 
showatstartup=1 

¿Cómo puede hacerse esto?

+1

¿Ha considerado migrar a XML para leer? –

+6

@Mike: se supone que XML es mejor legible que INI? ¡No puedes hablar en serio! – dummzeuch

+0

@Mike: Dejo que los usuarios editen archivos ini, cuando la creación de una GUI para cambiar una configuración no es rentable. Sin embargo, no me gustaría confiar en que esos usuarios editen un archivo XML a mano. –

Respuesta

9

Cargue el archivo e inserte líneas vacías antes de cada nombre de sección. He aquí una función para la que:

procedure InsertSectionLineBreaks(const IniFile: TFileName); 
var 
    f: TStrings; 
    i: Integer; 
begin 
    f := TStringList.Create; 
    try 
    f.LoadFromFile(IniFile); 
    for i := Pred(f.Count) downto 1 do 
     if (f[i] <> '') and (f[i][1] = '[') then 
     f.Insert(i, ''); 
    f.SaveToFile(IniFile); 
    finally 
    f.Free; 
    end; 
end; 

Tenga en cuenta que si ya existe una línea vacía antes de que el nombre de la sección, este código se añade otro. El bucle baja a uno en lugar de cero, suponiendo que no es necesario agregar una línea vacía sobre la primera sección en el archivo.

+0

+1 para 'Pred'.- –

+0

intentará esto gracias Rob –

+2

@Andreas OT: Detesto 'pred' en este contexto. Simplemente no puedo ver la virtud en comparación con 'Count-1'. –

1

Agregar manualmente las líneas es una solución viable. Otra opción es crear su propia clase personalizada que hereda de TIniFile y alterar el comportamiento para incluir un salto de línea adicional antes del encabezado de la sección.

Actualización: utilice TCustomIniFile como clase base si desea utilizar este enfoque, no TIniFile.

+0

buena idea para implementar en la clase personalizada –

+0

@Bork, he visto el código, en Delphi 2007 eso no va a funcionar. Todo lo que hace son llamadas a una DLL. No hay nada que alterar aquí a menos que desee volver a escribir el código por completo :-( – Johan

+1

@Johan: Use 'TMemIniFile' en su lugar. Esto se ajusta fácilmente. –

12

La manera más fácil sería abrir el archivo .ini usando TMemIniFile en vez de TIniFile. Funciona de la misma manera, pero cuando guarda (UpdateFile), los espacios se agregan automáticamente entre secciones.

+0

No solo te da tus espacios, también es mucho más robusta ¡que la versión depende de la API de perfil privado! –

+1

PERO también borra todos los comentarios que comienzan con ";" (que solía ser el estándar) del archivo, que es un problema en la zona lumbar. Es la razón por la que cambié a "//"comentarios. – dummzeuch

0

¿Por qué no utilizar el retorno de carro simple: Agregar (# 13 # 10);

Cuestiones relacionadas