Usuário com melhor resposta
Form trava ao carregar secoes ini

Pergunta
-
Ola
Meu código a baixo carrega um arquivo file1.txt contendo diversas seções e parâmetros:
Dim sectionName As String = String.Empty Using reader As New StreamReader(Application.StartupPath & "\file1.txt") While Not reader.EndOfStream Dim line As String = reader.ReadLine If line.StartsWith("[") AndAlso line.EndsWith("]") Then sectionName = line.Substring(1, line.Length - 2) Dim Assinatura = LerIni(filename, sectionName, "signature", "NotFound") '< demora Dim ep_only = LerIni(filename, sectionName, "ep_only", " ") 'para .text Dim nome As New ListViewItem(" ")
Dim AA = textbox1.text Dim match As Match = Regex.Match(AA, Assinatura, RegexOptions.IgnoreCase) If match.ToString.Replace(" ", "").Length > 10 Then ListView1.Items.Add(nome) nome.SubItems.Add(sectionName) nome.SubItems.Add(ep_only) nome.SubItems.Add(Assinatura) End If End If End While End Using
No ini contem dados como:
[Nome 1] signature = AAAAAAAAAAAAAAAAAaaa ep_only = true [Nome 2] signature = BBBBBBBBBBBBBB ep_only = true
Em "sectionName" eu extraio os nomes das seções, carrego com LerIni os parâmetros usando as seções extraídas e adiciono em um listview em colunas se contem a sectionName em meu textbox.
Ate ai tudo bem, mas o programa trava enquanto carrega:
Dim Assinatura = LerIni(filename, sectionName, "signature", "NotFound") '< demora
segunda-feira, 24 de agosto de 2015 17:08
Respostas
-
Olá Eliseu, não é a variável splittedLine, é a variável line.
- Marcado como Resposta Marcos SJ sexta-feira, 23 de outubro de 2015 17:58
quinta-feira, 10 de setembro de 2015 19:29
Todas as Respostas
-
Bom dia,
Tudo bem?
No momento do travamento, de que maneira o sistema se comporta? existe alguma mensagem de erro gerada?
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
terça-feira, 25 de agosto de 2015 13:06 -
Olá
Nenhuma mensagem de erro aparece, apenas o formulário trava até carregar os dados em:
Dim Assinatura = LerIni(filename, sectionName, "signature", "NotFound")
- Editado Eliseu5 quarta-feira, 26 de agosto de 2015 02:13
terça-feira, 25 de agosto de 2015 17:06 -
Posta como é seu Método LerIni
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestroquarta-feira, 26 de agosto de 2015 02:20 -
Module modINI Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" _ Alias "WritePrivateProfileStringW" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringW" (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 Sub SalvarIni(ByVal iniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamVal As String) Dim Result As Integer = WritePrivateProfileString(Section, ParamName, ParamVal, iniFileName) End Sub Public Function LerIni(ByVal IniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamDefault As String) As String Dim ParamVal As String = Space$(1024) Dim LenParamVal As Long = GetPrivateProfileString(Section, ParamName, ParamDefault, ParamVal, Len(ParamVal), IniFileName) LerIni = Left$(ParamVal, LenParamVal) End Function End Module
quarta-feira, 26 de agosto de 2015 03:06 -
Olá
Alguém? Alguma ideia? Ainda não consegui resolver...
terça-feira, 1 de setembro de 2015 03:27 -
Tenta usar o código igual está nesse Exemplo
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestroterça-feira, 1 de setembro de 2015 03:32 -
Olá Eliseu5, por acaso o arquivo é muito grande? Qual o tamanho para ser mais exato?quarta-feira, 2 de setembro de 2015 02:42
-
Olá
1.230 kB mas aumenta porque pode-se adicionar mais itens.
Meu objetivo é ler o código hexadecimal de um arquivo e comparar com os códigos de todas as seções contidos em "signature" em meu ini. Cada código encontrado é exibido em um listview junto com "ep_only" e o nome da seção.
Talvez tenho uma forma mais prática/rápida mas não consegui formar. :/
- Editado Eliseu5 quinta-feira, 3 de setembro de 2015 11:57
quinta-feira, 3 de setembro de 2015 11:32 -
Olá Bruno
Agradeço pela ajuda, testei o código mas ainda trava. :/
- Editado Eliseu5 quinta-feira, 3 de setembro de 2015 11:41
quinta-feira, 3 de setembro de 2015 11:32 -
Eliseu, existem dois arquivos: file1.txt e o arquivo ini (seu nome está armazenado na variável filename)
Qual o tamanho dos dois?
Tente depurar e por um breakpoint logo após o bloco Using do reader e veja se o código executa rápido ou devagar.
Última dica: É recomendado usar XML em vez de INI.
quinta-feira, 3 de setembro de 2015 17:52 -
Olá
filename e file1.txt são o mesmo arquivo. Só que em file1.txt ele extrai o nome das seções "[secao]" e na variavel filename extrai a assinatura "signature". Na realidade o arquivo é carregado duas vezes, em "StreamReader" e depois pelo ini. Hnn, e talvez seja um dos motivos que trava, não tinha me tocado. Mas e como abrir só uma vez se eu preciso dos dois (StreamReader + LerINI)?
Quanto ao XML, é uma boa dica, só que o arquivo INI em que eu uso é de terceiros, então não compensa ta convertendo toda vez que ele é atualizado.
segunda-feira, 7 de setembro de 2015 19:32 -
Olá Eliseu, analizando o código, o uso do StreamReader não é necessário. Você pode usar o métodos LerIni direto.
Se o seu problema é "não saber os nomes das seções", eu recomendo criar o seu próprio leitor de INI só com o StreamReader.
- Editado Guilherme L. Santos terça-feira, 8 de setembro de 2015 05:59
- Marcado como Resposta Eliseu5 quarta-feira, 9 de setembro de 2015 15:48
- Não Marcado como Resposta Eliseu5 quarta-feira, 9 de setembro de 2015 15:48
terça-feira, 8 de setembro de 2015 05:57 -
Olá
Olha, demorei muuito pra conseguir um código para encontrar o nome das seções. Já tentei criar um leitor INI personalizado mas não consegui. :/
quarta-feira, 9 de setembro de 2015 15:52 -
Olá Eliseu,
Tudo bem?
Gostaria de saber se a pergunta inicial já foi respondida.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
quarta-feira, 9 de setembro de 2015 16:06 -
Olá Marcos,
Não, não foi respondida pois eu continua com o problema sem solucionar, motivo ao qual fiz a pergunta.
quarta-feira, 9 de setembro de 2015 16:56 -
Olá eliseu,
Eu perguntei, pois é muito comum que o usuário que faz uma pergunta e recebe a resposta apropriada, continue desenvolvendo perguntas quando na verdade a pergunta inicial já foi respondida. Por exemplo:
- "Quanto é 1+1?"
-1+1=2
- "Mas e se eu dividir isso por 2?" ou por exemplo "Eu não conheço este sinal '='."
E assim por diante.
Eu entendo claramente porque fez a pergunta, você fez a pergunta porque você tem uma dúvida.
Se a pergunta inicial foi respondida a thread precisa ser fechada, independente se o usuário tem outros problemas relacionados a pergunta dele. Em casos assim a thread precisa ser fechada com a marcação da resposta. Obrigado por seu retorno, assim que algum usuário encontrar a resposta para o seu problema, por gentileza, marque a resposta para que a thread possa ser fechada.
Obrigado.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
- Editado Marcos SJ quarta-feira, 9 de setembro de 2015 18:56
quarta-feira, 9 de setembro de 2015 17:11 -
Ok :)
quarta-feira, 9 de setembro de 2015 18:26 -
Olá Eliseu. Bom, faz um booooom tempo que não programo em VB, mas tentei criar um leitor de Ini pra você:
Public Class IniSection Public Property SectionName As String Public Property Values As Dictionary(Of String, String) Public Sub New(name As String) SectionName = name Values = New Dictionary(Of String, String) End Sub Public Sub AddValue(key As String, val As String) If Values.ContainsKey(key) Then Values(key) = val Else Values.Add(key, val) End If End Sub End Class
Using reader As New StreamReader(Application.StartupPath & "\file1.txt") Dim sections As New List(Of Sections) Dim section As IniSection = Nothing While Not reader.EndOfStream Dim line = reader.ReadLine() If Not String.IsNullOrWhiteSpace(line) Then If line(0) = "[" AndAlso line(line.Length - 1) = "]" Then If section IsNot Nothing Then sections.Add(section) End If section = New IniSection(line.Substring(1, line.Length - 2)) Else Dim splittedLine = line.Split("=") Dim key = splittedLine(0) Dim val = splittedLine(1) section.AddValue(key, val) End If End If End While End Using
Fiz de cabeça então pode haver algum erro de sintaxe. Mas espero que você pegue o conceito :)
quarta-feira, 9 de setembro de 2015 19:07 -
Olá Guilherme
Agradeço muito pela ajuda...
1 - Esta dando erro em "sections" >>>> Dim sections As New List(Of sections):
Erro: Type sections is not defined.
2-Para extrair a seção uso dai digamos apenas "textbox1.text = section" ?
quarta-feira, 9 de setembro de 2015 22:37 -
Opa, perdão, vacilo meu :) O correto é:
Dim sections As New List(Of IniSection)
Você pode iterar sobre a lista e ver todas as seções carregadas e suas respectivas chaves
For Each section As IniSection In sections MsgBox("Mostrando chaves da seção " & section.SectionName) For Each par As KeyValuePair(Of String, String) In section.Values MsgBox("key = " & par.Key & " | Value = " & par.Value) Next Next
quinta-feira, 10 de setembro de 2015 00:15 -
Hnn, ok, entendi..
Guilherme, agora da erro em " Dim val = splittedLine(1)" >> "O índice estava fora dos limites da matriz."
Hn, se possui erro entre colchetes das seções (ex.: se nao fecha ou tem mais de um que fecha ou abre), retorna erro, não da so pra ignorar digamos? ou implica em todo codigo?
- Editado Eliseu5 quinta-feira, 10 de setembro de 2015 01:03
quinta-feira, 10 de setembro de 2015 00:33 -
Olá Eliseu, quando este erro acontecer denovo, passe seu mouse sobre a variável 'line' e poste o conteúdo dela.
quinta-feira, 10 de setembro de 2015 01:03 -
Olá
Segue erro:
Acredito que seja por causa de colchetes a mais ou a menos no ini, mas deveria ignorar pegando apenas os colchetes do inicio e do fim, ignorando se tiver mais no meio. Ex.: [Passaro [aguia]].
Além disso ele deixa sempre de fora a ultima secao, exibe todas menos a ultima.
- Editado Eliseu5 quinta-feira, 10 de setembro de 2015 15:32
quinta-feira, 10 de setembro de 2015 14:22 -
Olá Eliseu, não é a variável splittedLine, é a variável line.
- Marcado como Resposta Marcos SJ sexta-feira, 23 de outubro de 2015 17:58
quinta-feira, 10 de setembro de 2015 19:29 -
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
AtenciosamenteMarcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
sexta-feira, 23 de outubro de 2015 17:58