Ejemplo del contenido de un archivo INI | Liquid for developer
Después de unas semanas estoy de regreso, gracias por visitar este blog. Un archivo INI (Windows Initialization file)de acuerdo con la información existente en Wikipedia es un simple archivo de texto en el cual es posible guardar configuraciones para que una aplicación pueda usarla. Debido a su simplicidad fueron adoptados por muchos desarrolladores de aplicaciones, sin embargo al tratarse de archivos en texto plano cualquiera puede alterarlos dejando fuera de servicio a las aplicaciones que los usan en muchos casos.
Esto ha hecho que el uso de archivos INI halla caido en desuso, sin embargo eso no quiere decir que no podamos usarlos hoy en día y con las debidas precauciones explotarlos. En esta ocasión comparto el código fuente en VB.Net para como leer y escribir facilmente archivos INI.
Lo primero que haremos es llamar a las funciones GetPrivateProfileStringKey y WritePrivateProfileString, estas funciones forman parte del sistema operativo Windows, por lo que no es necesario llevar los archivos donde se encuentran integradas. Podemos declarar esas funciones en un archivo aparte (que debe formar parte de nuestro proyecto) y para ello declararemos las funciones como "Públicas" (de lo contrario no las podremos usar en el resto del programa) o "Privadas" si solo las vamos a usar en un módulo en especial. Yo por lo general todas las funciones que forman parte de la API de Windows las declaro como públicas:
Public Declare Function GetPrivateProfileStringKey Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
Ahora declararemos las funciones para leer y escribir el archivo INI:
'#### Purpose: Return INI key
'#### Created date: 05/05/2012
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 14/12/2018
'#### Last modified username: Juan Manuel Mar Hdz.
'#### Thanks to http://foro.powers.cl/viewtopic.php?t=180424
'#### Thanks to http://www.vbforums.com/showthread.php?t=188491
'#### Thanks to http://bytes.com/topic/c-sharp/answers/238255-isprint
Public Function readINIkey(file As String, section As String, key As String) As String
Dim lret As Long, i As Long
Dim ret As String = "", newstr As String = "", c As Char
If file.IsNullOrEmpty(file) = True Then
Return ""
Exit Function
End If
ret = New String(CChar(" "), 255)
lret = GetPrivateProfileStringKey(section.Trim, key.Trim, "", ret, Len(ret), file.Trim)
If InStr(ret, Chr(0)) Then
ret = Left$(ret, Len(ret) - 1)
End If
ret = ret.Trim
ret = ret.Replace(" ", "|")
For i = 0 To ret.Length - 1
c = ret.Substring(i, 1).Trim
If Char.IsControl(c) = False Then newstr = newstr.Trim + c.ToString().Trim
Next
ret = newstr.Trim
ret = ret.Replace("|", " ")
If ret.IsNullOrEmpty(ret) = True Then
Return ""
Else
Return ret.Trim
End If
End Function
'#### Purpose: Save INI key
'#### Created date: 11/05/2012
'#### Created by username: Juan Manuel Mar Hdz.
'#### Last modified date: 14/12/2018
'#### Last modified username: Juan Manuel Mar Hdz.
'#### Thanks to http://foro.powers.cl/viewtopic.php?t=180424
'#### Thanks to http://www.vbforums.com/showthread.php?t=188491
'#### Thanks to http://bytes.com/topic/c-sharp/answers/238255-isprint
Public Function saveINIkey(file As String, section As String, key As String, value As String) As Boolean
Dim lret As Long, ret As String = ""
lret = WritePrivateProfileString(section.Trim, key.Trim, value.Trim, file.Trim)
ret = lret.ToString().Trim().ToLower
If ret = "0" Then
Return False
Else
Return True
End If
End Function
Los archivos INI están compuestos de secciones que se escriben al inicio con los caracteres "[" y "]", por ejemplo "[configuration]", luego cada sección contiene llaves que es el equivalente a las variables dentro de un programa, estas sirven para almacenar información y finalmente valores o información asignada a esa llave. El proceso se repite según cuantas secciones necesitemos en nuestro programa e igualmente para las llaves que necesitemos dentro de cada sección.
Ejemplo:
[Red]
UsarProxy=1
Proxy=192.168.0.1
[Preferencias]
PaginaInicio=https://wikipedia.org
Maximizar=1
Como vemos hay dos secciones dentro de este archivo INI, la primera sección se llama Red y la segunda Preferencias. Cada sección tiene llaves, en el caso de Red tiene la llave UserProxy y Proxy y a su vez cada llave tiene un valor; UsarProxy tiene el valor 1 y Proxy una dirección IP, que corresponde a la ruta donde se encuentra ese proxy funcionando.
El funcionamiento de un archivo INI es realmente simple, como mencionamos anteriormente estos pueden ser creados/modificados con un simple editor de texto o bien desde programas. Yo he creado inicialmente el siguiente archivo INI y lo he guardado en la siguiente ruta (en mi PC) para empezar a modificarlo mediante un programa creado en VB.Net.
[section]
msg=
Este archivo se encuentra en la ruta D:\Manuel mar\software\vb.net\pruebas\pruebas\bin\Debug\testini.ini
Lo hice lo más simple posible, solo contiene una sección (section) y una llave (msg) la cual se encuentra vacía. Ahora crearemos un programa en VB.Net (yo uso SharpDevelop como mi entorno de desarrollo pero pueden usar otros), crearé un formulario con dos botones y un cuadro de texto para que lo que escribamos en el se guarde en el archivo INI.
Este es el código fuente que corresponde a los botones Leer y Escribir de nuestro programa:
Sub CmdReadClick(sender As Object, e As EventArgs)
Try
MsgBox(readINIkey("D:\Manuel mar\software\vb.net\pruebas\pruebas\bin\Debug\testini.ini", "section", "msg"))
Catch exp As Exception
MsgBox(exp.ToString)
End Try
End Sub
Sub CmdWriteClick(sender As Object, e As EventArgs)
Try
If txtValue.Text.IsNullOrEmpty(txtValue.Text) = True Then
MsgBox("Debe escribir algo para guardarlo en el archivo INI")
Else
If saveINIkey("D:\Manuel mar\software\vb.net\pruebas\pruebas\bin\Debug\testini.ini", "section", "msg", txtValue.Text) = True Then
MsgBox("Exito, archivo INI guardado")
Else
MsgBox("Fallo, archivo INI no guardado")
End If
End If
Catch exp As Exception
MsgBox(exp.ToString)
End Try
End Sub
Vamos a explicar el código fuente:
Como el archivo INI no contiene nada inicialmente si presionaramos el botón "Leer INI" nuestro programa mediante la función readINIkey iría al archivo INI que le estamos indicando (D:\Manuel mar\software\vb.net\pruebas\pruebas\bin\Debug\testini.ini), y leería la sección "section" y la llave "msg" para si todo salió bien retornar su valor y mostrarlo mediante un caja de mensajes (MsgBox). Pero como no contiene nada nuestro archivo solo veríamos ese MsgBox vacío, tal como la siguiente imagen.
Ahora escribamos lo que gustemos en la caja de texto bajo los dos botones y presionaremos el botón "Escribir INI", el resultado será el siguiente:
La función del botón "Escribir INI" (CmdWriteClick) validará inicialmente si estamos ingresando o no un texto en el cuadro de texto, si no es así no podremos continuar obteniendo un mensaje de error. Pero si hemos ingresado un texto entonces se llamará a la función saveINIkey la cual recibe como parámetros la ruta del archivo INI donde será guardada la configuración, la sección, la llave y el valor a almacenar. Si todo sale bien nos devolverá el valor True indicándonos que el archivo INI fue modificado sin problemas, False si hubo algún problema y mediante estas banderas le indicaremos al usuario del programa si su información fue guardada o no.
Si presionamos nuevamente el botón "Leer INI" ahora veremos que si hay un resultado mediante la función MsgBox, e igualmente si abrimos el archivo INI mediante un editor de texto veremos que efectivamente ha sido modificado.
Como recomendación siempre coloquen su código entre la secuencia Try, Catch para validar todo lo que hagan, en ocasiones algo externo podría fallar y colapsar nuestra aplicación.
Por último este código fuente forma parte de una librería personal, no la he podido liberar por varios contratiempos, espero pronto pueda hacerlo, estos códigos que he compartido tienen una doble licencia. GPL para usarse dentro de otros proyectos y BSD para usarse dentro de una empresa, ¿Porqué razón es esto así?, porque aunque soy partidario del software libre también trabajo para alguien más y es muy difícil que una empresa quiera liberar sus códigos fuentes. Esta librería fue desarrollada y es mantenida por mi como un proyecto personal, ajena a cualquier empresa, de manera que estos códigos se pueden usar libremente en cualquier proyecto, pero quedan atados a la licencia original (GPL), pero al tener que usarlos dentro de proyectos internos (una empresa por ejemplo) uso la licencia BSD que no obliga a nadie a liberar los cambios hechos, de esa manera cualquier ajuste o recorte que requiera el código queda dentro de la empresa y nada más, sin presionarla de ninguna manera. A la par la librería sigue creciendo por fuera con la experiencia adquirida.
Conclusiones:
Aunque los archivos INI ya no son muy usados hoy en día todavía son de mucha utilidad, este post del día de hoy nos mostró que es muy sencillo usarlos. Pueden usar estos códigos fuente como ustedes gusten (siempre y cuando respeten la licencia GPL para usarse en otros proyectos libres), espero les sean de utilidad.