Permanencia.vb

  1. ' Permanencia.vb — ProInf.net — feb-2012
  2. '
  3. ' Guardar campos definidos por el usuario en un archivo
  4. ' al estilo .INI o YAML
  5.  
  6. Imports System.IO
  7.  
  8. 'Ejemplo del archivo ".ini"
  9. '----------
  10. '#comentario
  11. 'Clave:
  12. ' Valor1
  13. ' Valor2
  14. '----------
  15. Public Class Permanencia
  16. Private salida As StreamWriter = Nothing
  17. Private entrada As StreamReader = Nothing
  18.  
  19. '--------------------------------------------
  20. ' INTERFAZ
  21.  
  22. Public Property Diccionario As New Dictionary(Of String, List(Of String))
  23.  
  24. Public Sub Agregar(ByVal clave As String, ByVal ParamArray valores() As String)
  25. Dim lista As New List(Of String)
  26. For Each valor In valores
  27. lista.Add(valor)
  28. Next
  29. Diccionario.Add(clave, lista)
  30. End Sub
  31.  
  32. Public Sub Agregar(ByVal clave As String, ByVal valores As IEnumerable)
  33. Dim lista As New List(Of String)
  34. For Each valor In valores
  35. lista.Add(valor.ToString())
  36. Next
  37. Diccionario.Add(clave, lista)
  38. End Sub
  39.  
  40. Public Function Obtener(ByVal clave As String, ByRef valores As IEnumerable) As Boolean
  41. Try
  42. valores = Diccionario.Item(clave)
  43. Return True
  44. Catch ex As KeyNotFoundException
  45. DialogoError(ex, "clave=" & clave)
  46. Return False
  47. End Try
  48. End Function
  49.  
  50. Public Function Obtener(ByVal clave As String, ByRef valor As String) As Boolean
  51. Try
  52. valor = Diccionario.Item(clave)(0)
  53. Return True
  54. Catch ex As ArgumentOutOfRangeException
  55. Return False
  56. Catch ex As KeyNotFoundException
  57. DialogoError(ex, "clave=" & clave)
  58. Return False
  59. End Try
  60. End Function
  61.  
  62. Public Function Escribir() As Boolean
  63. Try
  64. CopiaRespaldo()
  65. salida = New StreamWriter(ObtenerRuta(), append:=False)
  66. EscribirDiccionario()
  67. Return True
  68. Catch ex As Exception
  69. 'DialogoError(ex, "No puedo escribir la permanencia")
  70. Return False
  71. Finally
  72. If salida IsNot Nothing Then salida.Close()
  73. End Try
  74. End Function
  75.  
  76. Public Function Leer() As Boolean
  77. Try
  78. entrada = New StreamReader(ObtenerRuta())
  79. LeerDiccionario()
  80. Return True
  81. Catch ex As Exception
  82. 'DialogoError(ex, "No puede leer la permanencia")
  83. Return False
  84. Finally
  85. If entrada IsNot Nothing Then entrada.Close()
  86. End Try
  87. End Function
  88.  
  89. Private Sub CopiaRespaldo()
  90. Dim ruta = ObtenerRuta()
  91. Dim respaldo = Path.ChangeExtension(ruta, ".bak")
  92. If File.Exists(respaldo) Then File.Delete(respaldo)
  93. If File.Exists(ruta) Then File.Move(ruta, Path.ChangeExtension(ruta, ".bak"))
  94. End Sub
  95.  
  96. Public Overridable Function ObtenerRuta() As String
  97. Return Path.ChangeExtension(Application.ExecutablePath, ".ini")
  98. End Function
  99.  
  100. '--------------------------------------------
  101. ' PRIVADO
  102.  
  103. Private Sub EscribirDiccionario()
  104. EscribirEncabezado()
  105. Dim enumerador As IDictionaryEnumerator = Diccionario.GetEnumerator()
  106. Do While enumerador.MoveNext()
  107. salida.WriteLine("{0}:", enumerador.Key)
  108. For Each valor In enumerador.Value
  109. salida.WriteLine("{0}{1}", vbTab, valor)
  110. Next
  111. salida.WriteLine()
  112. Loop
  113. End Sub
  114.  
  115. Private Sub EscribirEncabezado()
  116. salida.WriteLine("# {0} — {1}",
  117. Path.GetFileName(ObtenerRuta()),
  118. Date.Now.ToString("yyyy-MM-dd HH:mm:ss"))
  119. salida.WriteLine()
  120. End Sub
  121.  
  122. Private Sub LeerDiccionario()
  123. Diccionario.Clear()
  124. Dim clave As String = ""
  125. Dim valores As New List(Of String)
  126. Do Until entrada.EndOfStream
  127. Dim linea = entrada.ReadLine()
  128. Dim elemento = linea.Trim()
  129. If elemento.Length = 0 OrElse elemento.StartsWith("#") Then
  130. 'Ignorar líneas vacía y comentarios
  131. ElseIf Char.IsWhiteSpace(linea(0)) Then
  132. valores.Add(elemento)
  133. ElseIf elemento.EndsWith(":") Then
  134. AgregarAlDiccionario(clave, valores)
  135. clave = linea.Substring(0, elemento.Length - 1)
  136. End If
  137. Loop
  138. AgregarAlDiccionario(clave, valores)
  139. End Sub
  140.  
  141. Private Sub AgregarAlDiccionario(
  142. ByRef clave As String,
  143. ByRef valores As List(Of String)
  144. )
  145. If clave <> "" Then
  146. Diccionario.Add(clave, valores)
  147. clave = ""
  148. valores = New List(Of String)
  149. End If
  150. End Sub
  151.  
  152. End Class
  153.  
  154.  

Proinf.net