Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

gastao

gravar seguinte formato em txt

Mensagens Recomendadas

gastao

tou a ler toda a configuração do meu programa a partir de um ini, mas eu queria configurar esse ini a partir do ini alguém me consegue dar uma ajuda??

[backupsSQL]

NomeBaseDados=nomeBD

CaminhoBaseDados=127.0.0.1\SQLEXPRESS

User=sa

Password=Password

bla...

bla...

tipo eu já tenho a estrutura so não sei e colocar qual o sitio certo... para ficar com essa estrutura

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Configurar o INI a partir do INI?

Tenta refrasear o teu pedido de ajuda por favor.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pt_V1p3r

tou a ler toda a configuração do meu programa a partir de um ini, mas eu queria configurar esse ini a partir do ini alguém me consegue dar uma ajuda??

tipo eu já tenho a estrutura so não sei e colocar qual o sitio certo... para ficar com essa estrutura

Gostava de ajudar mas inceramente nao percebi rigorosamente nada disto .....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Vai passar um pouco por a forma como o lês.

Se bem entendo do que escreveste, estás a ler o INI para uma estrutura em memória.

Que tipo de estrutura tens aí? Dictionary(Of String, String) ?


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

String, eu leio o ini na perfeição, só que imagina tenho algo mal configurado e queria em vez de ir a mao mudar queria mudar via form... ou seja tenho um form que me carrega o ini e altera lo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

String?

É uma boa altura para repensares a "estrutura" em memória.

Uma coisa tão simples como:

    Private Function CarregarINI(Caminho As String) As Dictionary(Of String, String)
       Dim tmpDic As New Dictionary(Of String, String)
       If Not FileIO.FileSystem.FileExists(Caminho) Then Return Nothing 'o ficheiro não existe
       Try
           With New IO.StreamReader(Caminho, System.Text.Encoding.Default)
               While Not .EndOfStream
                   Dim Linha As String = .ReadLine
                   If Linha.StartsWith("[") Then Continue While
                   If Linha.Contains("=") Then
                       tmpDic.Add(Linha.Split("=")(0).ToLower, Linha.Split("=")(1))
                   End If
               End While
               .Close()
           End With
           Return tmpDic
       Catch
           'algo correu mal. ou não pode abrir o ficheiro ou outra coisa qualquer.
           Return Nothing
       End Try
   End Function

Passa-te os dados do INI para um dicionário, que podes depois consultar e alterar como bem entenderes:

        Dim OMeuINI As Dictionary(Of String, String) = CarregarINI("caminho até ao ficheiro")
       OMeuINI("nome_da_propriedade") 'produz o valor da propriedade
       OMeuINI("nome_da_propriedade") = "novo valor" 'define novo valor à propriedade

Apresentar em formulário, gravar a partir de formulário, e fazeres o que bem te apetecer já se torna fácil a partir do momento em que tens em memória algo como o INI num dicionário.

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

eu tou a ler o meu ini da seguinte forma:

tenho um modulo no programa onde tenho a seguinte função

  Public Function GetIniSetting(ByVal strKey As String, ByVal strSection As String, ByVal strIniFile As String) As String
	Dim strValue As String
	Dim intPos As Integer
	On Error GoTo ErrTrap
	strValue = Space(1024)
	GetPrivateProfileString(strSection, strKey, "INI File Error", strValue, 1024, strIniFile)
	Do While InStrRev(strValue, " ") = Len(strValue)
		strValue = Mid(strValue, 1, Len(strValue) - 1)
	Loop
	' to remove a special chr in the last place
	strValue = Mid(strValue, 1, Len(strValue) - 1)
	GetIniSetting = strValue
ErrTrap:
	If Err.Number <> 0 Then Err.Raise(Err.Number, , "Error form Functions.GetIniSettings " & Err.Description)
End Function

onde tou a chamar os meus dados faço

Dim strIniFile As String = My.Application.Info.DirectoryPath & "\config.ini"

'Le qual os dados do Ini

Dim bdsql As String = GetIniSetting("CaminhoBaseDados", "BackupsSQL", strIniFile)

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Em termos de consciência das settings, vale zero.

Tens de saber sempre todos os nomes das settings e não tens forma de os contabilizar.

Aposto até que isso vai abrir o ficheiro sempre que uses o GetIniSetting.

Sugiro que repenses a situação, olhando para o que tens, o que eu sugeri e o que precisas.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

vou experimentar da maneira que disses te para ver se da aquilo que eu quero...

da tua maneira quando tento chamar a variável da me erro "expression not a method"

oMeuINI("CaminhoBaseDados")

imagina tou a fazer da seguinte maneira:

Dim oMeuINI As Dictionary(Of String, String) = CarregarINI("E:\Programação\BackupSQL\BackupSQL\bin\Debug\config.ini")
TextBox1.Text = oMeuINI("caminhobasedados")
TextBox2.Text = oMeuINI("nome") 'Aqui diz me que não se encontra no dicionario

so me 1 linha??

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Isso produz o valor. Tens de o atribuír a qualquer coisa...

No teu caso seria:

Dim bdsql As String = oMeuINI("CaminhoBaseDados")

Presumindo que já tinhas o INI carregado.

Perde algum tempo a tentar perceber o que isso faz! É pouco código!

Se não entenderes isso também não vais conseguir regravar o INI...


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

isso eu já percebi, eu já o csg por numa textbox e tudo só que a função que me puses te so me esta a ler um valor?? não deveria ler o ini todo???

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

A função CarregarINI lê o teu INI todo para um Dictionary... Leste o código como te sugeri?

Não sabes como iterar um Dictionary?

http://wiki.portugal-a-programar.pt/dev_net:vb.net:dictionaryof#percorrer_todos_os_pares_do_dicionario

Não sabes escrever para um ficheiro?

http://wiki.portugal-a-programar.pt/dev_net:vb.net:stream_readers_writers#escrever_para_um_ficheiro

Uma coisa que não vou fazer é escrever a função por ti...


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

eu não quero que escrevas nenhuma função por mim Sérgio apenas tou a tirar duvidas se eu não sei e não tenho vergonha em perguntar...

nunca trabalhei da forma como estas a dizer e parece me interessante, o que te perguntei foi se a função que me mostras te le me o ini todo. se sim certo

então eu de seguida fiz

Dim oMeuINI As Dictionary(Of String, String) = CarregarINI("E:\Programação\BackupSQL\BackupSQL\bin\Debug\config.ini")

TextBox1.Text = oMeuINI("caminhobasedados")

TextBox2.Text = oMeuINI("nome") 'Aqui diz me que não se encontra a chave no dicionário por isso e q estou a perguntar que aquela função não leu o ini todo ou tenho que fazer variável a variável??

é que o meu caminho da base de dados nem e a minha primeira linha por isso a minha duvida

e que eu de momento so estou a tentar passar o meu ini para o form para de seguida o mudar

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Ninguém está a pedir para teres vergonha :)

Sim, lê o INI todo para memória.

Se a chave não se encontra no dicionário é porque não existe "nome" no INI.

As chaves estão a ser passadas para letra pequena também.

Coloca aqui o teu INI, caso tenhas lá uma propriedade nome e o gajo não a esteja a papar.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

o meu ini é o seguinte:

[backupsSQL]

CaminhoBaseDados=127.0.0.1\SQLEXPRESS

User=sa

Password=pass

NomeBaseDados=GereAPP

caminho=e:\

ele e case sensitive?? é que eu já testei mais que um dado e nada mas o parâmetro caminhobasedados já me aparece numa textbox como eu quero...

é as minúsculas já percebi... assim que comecei a passar por minúsculas já me aparece tudo ;)

agora para passar novo valor faço

Dim oMeuINI As Dictionary(Of String, String) = CarregarINI("E:\Programação\BackupSQL\BackupSQL\bin\Debug\config.ini")

oMeuINI("nomebasedados") = TextBox2.Text

isto em cima grava me o dictionary correcto?? e depois como passo o dicionário para o ini visto que isto não deixa de ser um file txt

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Sim, como tens no final vai afectar a entrada do dicionário.

Para gravar, reescreve o INI com base no dicionário.

O que não consegues perceber a partir do que te enviei para iterar o dicionário e escrever para um ficheiro? Comecemos por aí.

Só um aparte. Não tens de usar o método CarregarINI sempre que precisas de trabalhar valores.

Só precisas de chamar o CarregarINI uma única vez por execução.

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

eu tou a carregar o ini por evento, pq imagina no meu form load ele coloca me logo o ini onde eu quero e depois ao gravar chamo novamente para ele assumir os valores que eu desejo como exemplefiquei.

o que nao percebo é mesmo escrever ou alterar o ficheiro(ini) que eu ja tenho.

pelo que percebi vou ter q fazer a função completamente ao contrario do ler penso eu

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Repara que o CarregaINI carrega o ficheiro para memória. A partir daí, afectas o dicionário e apenas o dicionário. Não precisas de estar a recarregar o INI sempre que o graves. Só é necessário carregar mesmo UMA vez. Gravar é que deves gravar a cada alteração.

Para gravar é algo mesmo simples... aqui tens um exemplo completo:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Dim meuIni As Dictionary(Of String, String) = CarregarINI("ficheiro.ini")
       meuIni("setting1") = "alterado!"
       meuIni("setting3") = "alterado!"
       EscreverINI("grupo-teste", meuIni, "ficheiro.ini")
   End Sub

   Private Function CarregarINI(Caminho As String) As Dictionary(Of String, String)
       Dim tmpDic As New Dictionary(Of String, String)
       If Not FileIO.FileSystem.FileExists(Caminho) Then Return Nothing 'o ficheiro não existe
       Try
           With New IO.StreamReader(Caminho, System.Text.Encoding.Default)
               While Not .EndOfStream
                   Dim Linha As String = .ReadLine
                   If Linha.StartsWith("[") Then Continue While
                   If Linha.Contains("=") Then
                       tmpDic.Add(Linha.Split("=")(0).ToLower, Linha.Split("=")(1))
                   End If
               End While
               .Close()
           End With
           Return tmpDic
       Catch
           'algo correu mal. ou não pode abrir o ficheiro ou outra coisa qualquer.
           Return Nothing
       End Try
   End Function

   Private Sub EscreverINI(Grupo As String,
                           DicionarioINI As Dictionary(Of String, String),
                           Caminho As String)
       Try
           With New IO.StreamWriter(Caminho, False, System.Text.Encoding.Default)
               .WriteLine("[" & Grupo & "]")
               For Each KVP As KeyValuePair(Of String, String) In DicionarioINI
                   .WriteLine(KVP.Key & "=" & KVP.Value)
               Next
               .Close()
           End With
       Catch
           'algo correu mal. ou não pode escrever o ficheiro ou outra coisa qualquer.
       End Try
   End Sub

O ficheiro INI antes de executar:

[grupo-teste]
setting1=teste
setting2=teste
setting3=teste
setting4=teste

O ficheiro INI depois de executar:

[grupo-teste]
setting1=alterado!
setting2=teste
setting3=alterado!
setting4=teste

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

vou testar da parte da tarde já te dou feedback sergio, e obrigado pela ajuda

funciona a 100% Sergio, um mto obrigada desde já

Editado por gastao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pt_V1p3r

Apenas uma pergunta, e porque nao trabalhas com o teu ficheiro ini, mas em formato xml ?

Com todas as ferramentas em .net, é extremamente simples de usar.

É extremamente funcional e rapido, e acima de tudo, vulgarmente usado para ficheiros de configurações...

ex :

<BackupsSQL>

<DataBaseName>nome</DataBaseName>

<DataBaseUrl>127.0.0.1</DataBaseUrl>

<DataBaseUser>sa</DataBaseUser>

<DataBasePassword>xxx</DataBasePassword>

</BackupsSQL>

Aproveito e deixo-te aqui dois links interessantes : http://www.macoratti.net/10/08/vbn_xml1.htm e http://www.dotnetperls.com/xmlwriter-vbnet

Editado por pt_V1p3r

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

nunca trabalhei com ficheiros xml sinceramente, mas deve ser igual em termos de formato... penso que ficheiros txt é me mais simples para aquilo que estou a fazer, pois apenas me vai buscar as minhas configurações que necessito.

eu programo a medida mas coisas básicas, gostava de aprofundar isto a fundo pois dei isto na escola e o que fui aprendendo e desenvolvendo foi por pesquisa e por aqui que me tem dado excelente apoio... principalmente o caça e o Sérgio...

mas o trabalho não me da tempo para isso tambem

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

ao chamar o meu ini estando ele encriptado ele ao fazer a desicriptaçao por exemplo da minha password da base de dados nunca me aparece igual a desicreptaçao... alguém tem alguma ideia??? da forma que tu me mostras te sergio...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tiago Simões Marques

[backupsSQL]

NomeBaseDados=nomeBD

CaminhoBaseDados=127.0.0.1\SQLEXPRESS

User=sa

Password=Password

bla...

bla...

Na minha opinião não punha uma password num ficheiro ini, por questões de segurança.

Cumprimentos,


Tiago Simões Marques

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

XML é de facto uma melhor opção. Mas não com os links que sugeres. Devem olhar para a Xdocument.

Neste caso não quis estar a desviar a thread e ajudei com o INI.

Para este tipo de situações até nem sugiro INI nem XML "unmanaged". Sugeria as Settings. Mas isso é outra história.

Em questões de segurança, não me choca colocares a password num ficheiro de configuração, dado que a encriptas devidamente.

Choca-me muito mais estares a usar o utilizador de administração ao invés de criares um user para a aplicação, com as devidas permissões.

Quanto ao teu problema, os métodos que te sugeri não alteram os valores, excepto se estiverem dependentes de uma codificação específica.

De qualquer forma, podes mostrar o teu algoritmo de encriptação e desencriptação? Podes ter alguma coisa mal por aí.

Editado por ribeiro55

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.