VB 2005 - Trabalhando com arquivos .INI


Você lembra dos arquivos .INI ? Eles tiveram seu momento de glória no Windows 3.1 e foram perdendo a importância. Apesar disso eles eram uma opção a usar o registro do sistema para armazenar informações das configurações da aplicação e outros dados que o desenvolvedor julgasse importantes.

Para acompanhar os artigos relacionados com este assunto veja também:

Os arquivos ini são arquivos textos com uma extensão .ini que contêm valores persistidos e que esta dividido em seções identificadas por um nome entre colchetes([Exemplo]) e uma chave a qual será atribuído um valor.

Cada seção pode conter uma nome de uma chave e a seguir o valor correspondente. Abaixo temos um exemplo de um arquivo .ini chamado macoratti.ini contendo duas seções : [Geral] e [Seguranca] com valores definidos previamente.

[Geral]
MsgEmpresa=Participe dos jogos internos
LogoEmpresa=c:\imagem\logo.gif

[Seguranca]
Password=365<?:
Administrador=Macoratti

 As funções da API  GetPrivateProfileString  e WritePrivateProfileString  são usadas para ler e escrever as entradas em um arquivo .INI. Para usar estas declarações de API no VB.NET devemos efetuar alguns ajustes nos tipos de dados dos parâmetros.

Vamos criar um projeto usando o Visual Basic 2005 Express com o nome de arquivoININet, e, no formulário padrão form1.vb inclua 4 caixas de texto,  4 labels, um botão de comando e um controle checkBox conforme o leiaute abaixo:

Qual  é o nosso objetivo afinal ?

Bem ,  temos um arquivo .INI chamado macoratti.ini que se encontra na pasta bin da aplicação e vamos ler o conteúdo deste arquivo exibindo-o no formulário e ainda permitindo que o usuário altere os valores para em seguida salvar as alterações no mesmo arquivo .INI. Entendeu ?

Declare no projeto os seguintes namespaces usados :

Imports System.Security.Cryptography

Imports System.IO

Imports System.text

 

A seguir vamos declarar as funções das APIs que vamos usar:

 

Private Declare Auto Function GetPrivateProfileString Lib "Kernel32" ( ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As StringBuilder, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
 

Private Declare Auto Function WritePrivateProfileString Lib "Kernel32" ( ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer

 

Vamos incluir o seguinte código no evento Load do formulário para que quando ele seja aberto os dados sejam exibidos no formulário:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 

Dim nome_arquivo_ini As String = nomeArquivoINI()


If
Not File.Exists(nome_arquivo_ini)
Then

    MsgBox("Será carregado os valores padrão do sistema.")

End If
 

txtMensagem.Text = LeArquivoINI(nome_arquivo_ini, "Geral", "MsgEmpresa", "Atualiza o seu cadastro")

txtLogoTipo.Text = LeArquivoINI(nome_arquivo_ini, "Geral", "LogoEmpresa", "logo.gif")

txtSenha.Text = LeArquivoINI(nome_arquivo_ini, "Seguranca", "Password", "??????")

txtAdmin.Text = LeArquivoINI(nome_arquivo_ini, "Seguranca", "Administrador", "Mac")


End
Sub

Para ler os arquivos usamos a função LeArquivoINI informando o nome do arquivo ini, a seção que desejamos ler, a chave da seção onde estão os dados e informamos um valor padrão que será usado se o arquivo não for encontrado ou se um dos valores não estiver definido no arquivo.

O código da função LeArquivoINI que irá obter os valores do arquivo INI e exibir nas caixas de texto é dado a seguir:

' Usa a função GetPrivateProfileString para obter os valores

Private Function LeArquivoINI(ByVal file_name As String, ByVal section_name As String, ByVal key_name As String, ByVal default_value As String) As String


Const MAX_LENGTH As Integer = 500

Dim string_builder As New StringBuilder(MAX_LENGTH)


GetPrivateProfileString(section_name, key_name, default_value, string_builder, MAX_LENGTH, file_name)


Return
string_builder.ToString()


End
Function

 

A rotina nomeArquivoINI() apenas obtêm o caminho da pasta \bin do aplicativo e acrescenta o nome do arquivo .INI :  macoratti.ini:

' Retorna o nome do arquivo INI

Private Function nomeArquivoINI() As String


Dim nome_arquivo_ini As String = Application.StartupPath

nome_arquivo_ini = nome_arquivo_ini.Substring(0, nome_arquivo_ini.LastIndexOf("\"))


Return
nome_arquivo_ini &
"\macoratti.ini"


End
Function

Vamos agora tratar da rotina que efetua a gravação dos dados no arquivo macoratti.ini. Aqui temos um recurso para poder gerar um hash da senha e gravar no arquivo .ini. É por isso que usamos a classe  MD5CryptoServiceProvider()  do namespace Imports System.Security.Cryptography.

Para salvar os dados no arquivo .ini usamos a rotina

Private Sub gravaArquivoini()
 

Dim nome_arquivo_ini As String = nomeArquivoINI()

Dim valorSenha As String


If
chkCifrar.Checked
Then

    valorSenha = geraHash(txtSenha.Text)

Else

    valorSenha = txtSenha.Text

End If
 

WritePrivateProfileString("Geral", "MsgEmpresa", txtMensagem.Text, nome_arquivo_ini)

WritePrivateProfileString("Geral", "LogoEmpresa", txtLogoTipo.Text, nome_arquivo_ini)

WritePrivateProfileString("Seguranca", "Password", valorSenha, nome_arquivo_ini)

WritePrivateProfileString("Seguranca", "Administrador", txtAdmin.Text, nome_arquivo_ini)

End Sub

O código da rotina geraHash que será usada, somente se o usuário marcar esta opção no formulário, é o seguinte:

Private Function geraHash(ByVal valor As String) As String
 

'Crria um objeto encoding para assegurar o encoding padrão para o texto fonte

Dim Ue As New UnicodeEncoding()


'Retorna um array de bytes baseado no texto fonte

Dim ByteSourceText() As Byte = Ue.GetBytes(valor)


'Instancia um objeto MD5

Dim Md5 As New MD5CryptoServiceProvider()


'Calcula o valor do hash para o texto

Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)


'Converte o valor para o formato string e retorna

Return Convert.ToBase64String(ByteHash)


End
Function

Percebeu como é fácil gerar um hash na plataforma .NET ? A vantagem em usar um hash é que ele praticamente inviolável e se uma pessoa mal intencionada obter o seu valor não terá a senha , apenas o seu hash.

Para gravar os dados chamamos a rotina no evento Click do botão de comando e no evento Closing do formulário:

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click

      gravaarquivoini()

End Sub
 


Private
Sub Form1_Closing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

gravaarquivoini()

End Sub

Ao executar o projeto iremos obter:

Eu não estou encorajando você a usar os arquivos .INI, eles podem ter uma certa utilidade em certas ocasiões, e têm algumas vantagens sobre  o registro do Windows pois são fáceis de editar, visualizar e compartilhar em uma rede local; com o registro do Windows não podemos fazer isto. Além disso você pode ter múltiplas configurações gerando diversos arquivos INI cada um com o nome do seu usuário.

Pegue o projeto completo aqui : backupDAO_Net.zip

Com VB.NET você pode , então vá...


José Carlos Macoratti