none
Que Funcion o Clase o Procedimiento reemplaza a GetPrivateProfileString y WritePrivateProfileString en VB.NET

    Pregunta

  • Estimados Bendiciones a Todos...

    Genero esta Pregunta debido a que en vb6 se utilizaban estas funciones para escribir o leer texto de un archivo .txt, como los clásicos archivos .ini, se que existen la funciones streamWriter y StreamReader para escribir o leer archivos .txt, pero estas funciones leen una línea completa y escriben una línea al final del contenido del archivo. No como getprivateprofilestring o writeprivateprofilestring que leen una porción especifica del archivo según un criterio dado y escriben un texto en una posición especifica según un criterio dado, según corresponda.

    En .NET existe algo parecido o definitivamente no?, Me Podrían Ayudar por favor...

    martes, 20 de diciembre de 2016 19:46

Respuestas

  • Si de verdad quieres leer y grabar un .ini, puedes llamar a GetPrivateProfileString y WritePrivateProfileString si las declaras antes con un "declare" parecido al de vb6, o mejor con un <DllImport> que es el equivalente moderno. Podrás encontrar las declaraciones y ejemplos de llamada en pinvoke.net:

    http://www.pinvoke.net/default.aspx/kernel32/GetPrivateProfileString.html

    Sin embargo, si no tienes el requisito de que el formato del fichero sea precisamente el de un .ini, sino que simplemente quieres guardar los ajustes del programa, entonces es mejor que uses los Settings. Por dentro graban un xml, pero esto es transparente para el código, que solo tiene que leer y grabar variables, y se salvan internamente en el fichero:

    https://msdn.microsoft.com/es-es/library/saa62613.aspx

    martes, 20 de diciembre de 2016 21:19
  • Hola:
    Este ejemplo interactua con un fichero llamado Parametro.xml. Lee y Escribe en dicho Fichero.
    Imagen del Form
    ===============

    Codigo del Form
    ===============
    Imports System.IO
    Public Class Form1
        Dim msFichero As String = Directory.GetCurrentDirectory() & "\Parametro.xml"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.btnLeer.Enabled = False
            Me.btnEscribir.Enabled = False
            If System.IO.File.Exists(msFichero) = False Then
                MessageBox.Show("No existe el Fichero de configuracion", "Load", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            Else
                Me.btnLeer.Enabled = True
                Me.btnEscribir.Enabled = True
            End If
        End Sub
        Private Sub btnLeer_Click(sender As Object, e As EventArgs) Handles btnLeer.Click
            If Me.txtSeccion.Text.Length = 0 Or Me.txtValor.Text.Length = 0 Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            Dim FicConfigXml As New ConfiguracionXml
            Me.lblResultado.Text = FicConfigXml.gF_sDatodeFichero(msFichero, Me.txtSeccion.Text, Me.txtValor.Text)
        End Sub
        Private Sub btnEscribir_Click(sender As Object, e As EventArgs) Handles btnEscribir.Click
            If Me.txtSeccion.Text.Length = 0 Or Me.txtValor.Text.Length = 0 Or Me.txtTexto.Text.Length = 0 Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            Dim FicConfigXml As New ConfiguracionXml
            FicConfigXml.gP_DatoaFichero(msFichero, Me.txtSeccion.Text, Me.txtValor.Text, Me.txtTexto.Text)
            MessageBox.Show("CAMBIO EFECTUADO", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
        End Sub
    End Class

    Codigo de la Clase ConfiguracionXml
    ===================================
    Option Explicit On
    Option Strict On
    Imports System.Xml
    Imports System.Security.Cryptography
    Imports System.Windows.Forms
    ''***********************************************************************************
    ''** Descripción: Esta clase nos permite leer/escribir una cadena de conexión de
    ''**              un fichero XML
    ''***********************************************************************************
    Public Class ConfiguracionXml
        Private msKey As String = "MyKey"
    #Region "Metodos"
        ''*************************************************************************
        ''** Descripción: Se encarga de leer el valor del atributo de la sección seleccionada
        ''**              mediante una sentencia Xpath
        ''** Param In:    xmlDoc : Mantiene el documento XML pasado por parámetro
        ''**              NombreSeccion : Identifica el nombre de la sección a buscar mediante el Xpath
        ''**              NombreClave   : Identifica el nombre de la clave a buscar mediante el Xpath
        ''** Param Out:   Devuelve el valor del atributo indicado
        ''************************************************************************
        Private Function lF_sLeer(ByVal xmlDoc As XmlDocument, ByVal NombreSeccion As String, ByVal NombreClave As String) As String
            Dim strValorClave As String
            ''** Nos situamos en el nodo que queremos
            Dim xpath As String = String.Format("//section[@name='{0}']/setting[@name='{1}']", NombreSeccion, NombreClave)
            Dim node As XmlNode = xmlDoc.DocumentElement.SelectSingleNode(xpath)
            ''** Recuperamos el Valor del Atributo o Clave
            If IsNothing(node) Then
                Throw New Exception(String.Format("No hay ningúna section(seccion) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
            Else
                Dim xmlAttr As XmlAttribute = node.Attributes("value")
                If IsNothing(xmlAttr) Then
                    Throw New Exception(String.Format("No hay valor en setting(ajuste o Atributo) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
                Else
                    strValorClave = xmlAttr.Value
                End If
            End If
            Return strValorClave
        End Function
        ''*************************************************************************
        ''** Descripción: Se encarga de escribir el valor del atributo en la sección seleccionada mediante una sentencia Xpath
        ''** Param In:    xmlDoc : Mantiene el documento XML pasado por parámetro
        ''**              NombreSeccion : Identifica el nombre de la sección a buscar mediante el Xpath
        ''**              NombreClave   : Identifica el nombre de la clave a buscar mediante el Xpath
        ''**              Valor  :   Escribe el valor del atributo indicado
        ''** Param Out:   Devuelve si la operacion es correcta
        ''************************************************************************
        Private Function lF_bEscribir(ByVal xmlDoc As XmlDocument, ByVal NombreSeccion As String, ByVal NombreClave As String, ByVal Valor As String) As Boolean
            Dim lbRetorno As Boolean = False
            ''** Nos situamos en el nodo que queremos
            Dim xpath As String = String.Format("//section[@name='{0}']/setting[@name='{1}']", NombreSeccion, NombreClave)
            Dim node As XmlNode = xmlDoc.DocumentElement.SelectSingleNode(xpath)
            ''** Recuperamos el Valor del Atributo o Clave
            If IsNothing(node) Then
                Throw New Exception(String.Format("No hay ningúna section(seccion) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
            Else
                Dim xmlAttr As XmlAttribute = node.Attributes("value")
                If IsNothing(xmlAttr) Then
                    Throw New Exception(String.Format("No hay valor en setting(ajuste o Atributo) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
                Else
                    'Escribir el valor en la clave
                    xmlAttr.Value = Valor
                    lbRetorno = True
                End If
            End If
            Return lbRetorno
        End Function
        Public Function gF_sDatodeFichero(ByVal vsFichero As String, ByVal vsClave As String, ByVal vsValor As String) As String
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichero Xml
            xmlDoc.Load(vsFichero)
            Return lF_sLeer(xmlDoc, vsClave, vsValor)
        End Function
        Public Function gF_sDatoCifrado(ByVal vsFichero As String, ByVal vsClave As String, ByVal vsValor As String) As String
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichro Xml
            xmlDoc.Load(vsFichero)
            Return gF_sDesEncripta(lF_sLeer(xmlDoc, vsClave, vsValor))
        End Function
        Public Sub gP_DatoaFichero(ByVal vsFichero As String, ByVal vsSeccion As String, ByVal vsClave As String, ByVal vsValor As String)
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichro Xml
            xmlDoc.Load(vsFichero)
            If lF_bEscribir(xmlDoc, vsSeccion, vsClave, vsValor) = True Then
                xmlDoc.Save(vsFichero)
            End If
        End Sub
    #End Region
        Public Function gF_sEncripta(ByVal sIn As String) As String
            Dim DES As New TripleDESCryptoServiceProvider
            Dim hashMD5 As New MD5CryptoServiceProvider
            Dim lsRetorno As String = String.Empty
            ' Compute the MD5 hash.
            DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(msKey))
            ' Set the cipher mode.
            DES.Mode = CipherMode.ECB
            ' Create the encryptor.
            Dim DESEncrypt As ICryptoTransform = DES.CreateEncryptor()
            ' Get a byte array of the string.
            Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(sIn)
            ' Transform and return the string.
            Try
                lsRetorno = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Catch Exp As System.Security.Cryptography.CryptographicException
                MessageBox.Show(Exp.Message, "gF_sEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "gF_sEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lsRetorno
        End Function
        Public Function gF_sDesEncripta(ByVal sOut As String) As String
            Dim DES As New TripleDESCryptoServiceProvider
            Dim hashMD5 As New MD5CryptoServiceProvider
            Dim lsRetorno As String = Nothing
            ' Compute the MD5 hash.
            DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(msKey))
            ' Set the cipher mode.
            DES.Mode = CipherMode.ECB
            ' Create the decryptor.
            Dim DESDecrypt As ICryptoTransform = DES.CreateDecryptor()
            Dim Buffer As Byte() = Convert.FromBase64String(sOut)
            ' Transform and return the string.
            Try
                lsRetorno = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Catch Exp As System.Security.Cryptography.CryptographicException
                MessageBox.Show(Exp.Message, "gF_sDesEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "gF_sDesEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lsRetorno
        End Function
    End Class

    El Fichero Parametro.xml, tiene el siguiente texto
    =================================================
    <?xml version="1.0" encoding="windows-1252"?>
    <Root>
      <section name="SQL">
        <setting name="Servidor" value=".\SQLEXPRESS">
        </setting>
        <setting name="Base" value="INSPECCION">
        </setting>
      </section>
      <section name="MYSQL">
        <setting name="Servidor" value="localhost">
        </setting>
        <setting name="Base" value="pin">
        </setting>
      </section>
      <section name="ACCESS">
        <setting name="Base" value="D:\Codigo\VB2013\Spire_EXPORT\Spire_EXPORT\bin\Release\PRUEBA.ACCDB">
        </setting>
      </section>
    </Root>

    P.D.

    Espero que te sirva

    Un saludo desde Bilbo
    Carlos

    jueves, 22 de diciembre de 2016 9:22
  • Para leer:

            archivo= ruta + "eltexto.txt"
            Dim MiTexto = IO.File.ReadAllLines(archivo)

            For Each linea As String In MiTexto
               'aqui traes una linea en cada vuelta, ya tu sabes que haces con el texto

                'linea es la variable que contiene el texto leido

            Next

    para escribir:

            archivo= ruta + "eltexto.txt"
             FileOpen(2, archivo, OpenMode.Output)

            Print(2, Space(35) + Today().ToLongDateString)
            Print(2, vbNewLine)
            Print(2, StrDup(80, "*"))
            Print(2, vbNewLine)

            Print(2, "Cualquier texto")

            FileClose(2)

    Así como use el canal 2 para escribir puedes usar el 1,2,3,4.... etc

    Saludos

    Si te sirve marcalo como respuesta correcta


    viernes, 23 de diciembre de 2016 16:15

Todas las respuestas

  • Si de verdad quieres leer y grabar un .ini, puedes llamar a GetPrivateProfileString y WritePrivateProfileString si las declaras antes con un "declare" parecido al de vb6, o mejor con un <DllImport> que es el equivalente moderno. Podrás encontrar las declaraciones y ejemplos de llamada en pinvoke.net:

    http://www.pinvoke.net/default.aspx/kernel32/GetPrivateProfileString.html

    Sin embargo, si no tienes el requisito de que el formato del fichero sea precisamente el de un .ini, sino que simplemente quieres guardar los ajustes del programa, entonces es mejor que uses los Settings. Por dentro graban un xml, pero esto es transparente para el código, que solo tiene que leer y grabar variables, y se salvan internamente en el fichero:

    https://msdn.microsoft.com/es-es/library/saa62613.aspx

    martes, 20 de diciembre de 2016 21:19
  • Si de verdad quieres leer y grabar un .ini, puedes llamar a GetPrivateProfileString y WritePrivateProfileString si las declaras antes con un "declare" parecido al de vb6, o mejor con un <DllImport> que es el equivalente moderno. Podrás encontrar las declaraciones y ejemplos de llamada en pinvoke.net:

    http://www.pinvoke.net/default.aspx/kernel32/GetPrivateProfileString.html

    Sin embargo, si no tienes el requisito de que el formato del fichero sea precisamente el de un .ini, sino que simplemente quieres guardar los ajustes del programa, entonces es mejor que uses los Settings. Por dentro graban un xml, pero esto es transparente para el código, que solo tiene que leer y grabar variables, y se salvan internamente en el fichero:

    https://msdn.microsoft.com/es-es/library/saa62613.aspx

    Alberto Gracias por tu repuesta...

    Estuve Leyendo el link dek segundo párrafo y se bien para almacenar datos como dice de la misma aplicación, por lo que vi lo típico de una aplicación, pero no es posible crearlos a voluntad con una extencion diferente, eso es lo que vi...

    Tu conoces otra manera en vb.net o .NET que permita reemplazar las funciones que yo hice mención en mi pregunta...

    martes, 20 de diciembre de 2016 22:27
  • Tu conoces otra manera en vb.net o .NET que permita reemplazar las funciones que yo hice mención en mi pregunta...

    ¿Qué problema tienes con la respuesta del primer párrafo, que hace EXACTAMENTE lo que preguntabas, y de hecho incluso las funciones tienen el mismo nombre y usan los mismos parámetros?

    En fin, si lo que quieres es un acceso aleatorio a cualquier parte de un fichero, abre un FileStream (en el espacio de nombres System.IO) y luego usa su función Seek para posicionarte en cualquier lugar del fichero, y una vez ahí, puedes usar Read o Write para leer o escribir los bytes que quieras en esa posición. Ten en cuenta que esto maneja el fichero en binario, y no entiende nada de retornos de carro y saltos de línea. Si quisieras leer líneas de un fichero de texto, podrías usar StreamReader y StreamWriter, pero estos requieren leer el fichero entero, cambiar en memoria lo que quieras, y volver a escribir todo el fichero. No puedes cambiar con estos objetos solamente un bloque del fichero directamente en el disco.

    miércoles, 21 de diciembre de 2016 8:50
  • Hola:
    Mira el siguiente enlace
    http://www.elguille.info/NET/dotnet/clase_manejar_datos_configuracion_2003.htm
    Un saludo desde Bilbo
    Carlos
    miércoles, 21 de diciembre de 2016 10:06
  • Alberto gracias por tu respuesta...

    Bueno, verdad no explique por que no lo del primer párrafo, pero es que si voy a migrar a .NET quiero hacerlo completo y desligarme de COM, y no estar picoteando APIS a diestra o siniestra.

    Mira, es verdad lo de "Seek", pero justo lo que explicas es lo que no quiero hacer, estar suma resta conversiones, posiciones de memoria punteros y eso para escribir o leer un texto de un mísero archivo, y que se supone con .NET debiera por evolución y lógica ser mas fácil que antes hacer lo mismo o no debiera es muy tonto mi pensamiento.

    En resumen, y viendo que este famoso .NET no es capas de algo simple (creo yo), tendré que desarrollar mi propias funciones evolucionadas, es triste pero no veo otra alternativa.

    miércoles, 21 de diciembre de 2016 13:45
  • J. Carlos Gracias por tu ayuda.

    Mira, el guille para mi en vb6 ha sido un maestro, pero quizás el tiempo no le de para todo, por que he visto que sus ejemplos están con el framework 3 máximo y casi todos con el WPF.

    Agradesco tu comentario, lo digo enserio, pero lo que necesito es crear un archivo aparte del config del app por que la información que se necesita guardar no debe ser obvia en buscar y como tu sabes el pirateo no te paga ni un dólar, euro, peso, al que lo desarrolla.

    miércoles, 21 de diciembre de 2016 13:56
  • Te doy otra alternativa:

    Dim lineas as String() = System.IO.File.ReadAllLines(fichero)

    Esto te trae todo el fichero a un array de strings. Puedes añadir, modificar, o quitar líneas en el array, y luego llamas a File.WriteAllLines y te graba todo de vuelta en el fichero.

    De hecho, algo parecido a esto es lo que hacen por dentro las rutinas GetProvateProfileString y WritePrivateProfileString, así que trabajando de esta manera no incurres en ninguna ineficiencia adicional. Y hablando de ineficiencia, las llamadas que yo te sugería estaban hechas por medio de P/Invoke, no usan COM, van directas a las APIs. Cosa que en última instancia siempre hacen todos los métodos de .Net, ya que en .Net no existen instrucciones de entrada/salida. Todas las funciones de librería como por ejemplo el FileStream al final usan P/Invoke para llamar a las APIs de Windows.

    • Propuesto como respuesta Willams Morales miércoles, 21 de diciembre de 2016 17:21
    • Votado como útil Negochile jueves, 22 de diciembre de 2016 22:57
    miércoles, 21 de diciembre de 2016 14:07
  • Hola:
    Este ejemplo interactua con un fichero llamado Parametro.xml. Lee y Escribe en dicho Fichero.
    Imagen del Form
    ===============

    Codigo del Form
    ===============
    Imports System.IO
    Public Class Form1
        Dim msFichero As String = Directory.GetCurrentDirectory() & "\Parametro.xml"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.btnLeer.Enabled = False
            Me.btnEscribir.Enabled = False
            If System.IO.File.Exists(msFichero) = False Then
                MessageBox.Show("No existe el Fichero de configuracion", "Load", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            Else
                Me.btnLeer.Enabled = True
                Me.btnEscribir.Enabled = True
            End If
        End Sub
        Private Sub btnLeer_Click(sender As Object, e As EventArgs) Handles btnLeer.Click
            If Me.txtSeccion.Text.Length = 0 Or Me.txtValor.Text.Length = 0 Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            Dim FicConfigXml As New ConfiguracionXml
            Me.lblResultado.Text = FicConfigXml.gF_sDatodeFichero(msFichero, Me.txtSeccion.Text, Me.txtValor.Text)
        End Sub
        Private Sub btnEscribir_Click(sender As Object, e As EventArgs) Handles btnEscribir.Click
            If Me.txtSeccion.Text.Length = 0 Or Me.txtValor.Text.Length = 0 Or Me.txtTexto.Text.Length = 0 Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                Return
            End If
            Dim FicConfigXml As New ConfiguracionXml
            FicConfigXml.gP_DatoaFichero(msFichero, Me.txtSeccion.Text, Me.txtValor.Text, Me.txtTexto.Text)
            MessageBox.Show("CAMBIO EFECTUADO", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
        End Sub
    End Class

    Codigo de la Clase ConfiguracionXml
    ===================================
    Option Explicit On
    Option Strict On
    Imports System.Xml
    Imports System.Security.Cryptography
    Imports System.Windows.Forms
    ''***********************************************************************************
    ''** Descripción: Esta clase nos permite leer/escribir una cadena de conexión de
    ''**              un fichero XML
    ''***********************************************************************************
    Public Class ConfiguracionXml
        Private msKey As String = "MyKey"
    #Region "Metodos"
        ''*************************************************************************
        ''** Descripción: Se encarga de leer el valor del atributo de la sección seleccionada
        ''**              mediante una sentencia Xpath
        ''** Param In:    xmlDoc : Mantiene el documento XML pasado por parámetro
        ''**              NombreSeccion : Identifica el nombre de la sección a buscar mediante el Xpath
        ''**              NombreClave   : Identifica el nombre de la clave a buscar mediante el Xpath
        ''** Param Out:   Devuelve el valor del atributo indicado
        ''************************************************************************
        Private Function lF_sLeer(ByVal xmlDoc As XmlDocument, ByVal NombreSeccion As String, ByVal NombreClave As String) As String
            Dim strValorClave As String
            ''** Nos situamos en el nodo que queremos
            Dim xpath As String = String.Format("//section[@name='{0}']/setting[@name='{1}']", NombreSeccion, NombreClave)
            Dim node As XmlNode = xmlDoc.DocumentElement.SelectSingleNode(xpath)
            ''** Recuperamos el Valor del Atributo o Clave
            If IsNothing(node) Then
                Throw New Exception(String.Format("No hay ningúna section(seccion) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
            Else
                Dim xmlAttr As XmlAttribute = node.Attributes("value")
                If IsNothing(xmlAttr) Then
                    Throw New Exception(String.Format("No hay valor en setting(ajuste o Atributo) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
                Else
                    strValorClave = xmlAttr.Value
                End If
            End If
            Return strValorClave
        End Function
        ''*************************************************************************
        ''** Descripción: Se encarga de escribir el valor del atributo en la sección seleccionada mediante una sentencia Xpath
        ''** Param In:    xmlDoc : Mantiene el documento XML pasado por parámetro
        ''**              NombreSeccion : Identifica el nombre de la sección a buscar mediante el Xpath
        ''**              NombreClave   : Identifica el nombre de la clave a buscar mediante el Xpath
        ''**              Valor  :   Escribe el valor del atributo indicado
        ''** Param Out:   Devuelve si la operacion es correcta
        ''************************************************************************
        Private Function lF_bEscribir(ByVal xmlDoc As XmlDocument, ByVal NombreSeccion As String, ByVal NombreClave As String, ByVal Valor As String) As Boolean
            Dim lbRetorno As Boolean = False
            ''** Nos situamos en el nodo que queremos
            Dim xpath As String = String.Format("//section[@name='{0}']/setting[@name='{1}']", NombreSeccion, NombreClave)
            Dim node As XmlNode = xmlDoc.DocumentElement.SelectSingleNode(xpath)
            ''** Recuperamos el Valor del Atributo o Clave
            If IsNothing(node) Then
                Throw New Exception(String.Format("No hay ningúna section(seccion) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
            Else
                Dim xmlAttr As XmlAttribute = node.Attributes("value")
                If IsNothing(xmlAttr) Then
                    Throw New Exception(String.Format("No hay valor en setting(ajuste o Atributo) , con este Xpath:{0}{1}", Environment.NewLine, xpath))
                Else
                    'Escribir el valor en la clave
                    xmlAttr.Value = Valor
                    lbRetorno = True
                End If
            End If
            Return lbRetorno
        End Function
        Public Function gF_sDatodeFichero(ByVal vsFichero As String, ByVal vsClave As String, ByVal vsValor As String) As String
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichero Xml
            xmlDoc.Load(vsFichero)
            Return lF_sLeer(xmlDoc, vsClave, vsValor)
        End Function
        Public Function gF_sDatoCifrado(ByVal vsFichero As String, ByVal vsClave As String, ByVal vsValor As String) As String
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichro Xml
            xmlDoc.Load(vsFichero)
            Return gF_sDesEncripta(lF_sLeer(xmlDoc, vsClave, vsValor))
        End Function
        Public Sub gP_DatoaFichero(ByVal vsFichero As String, ByVal vsSeccion As String, ByVal vsClave As String, ByVal vsValor As String)
            Dim xmlDoc As XmlDocument = New XmlDocument
            '**Cargamos el fichro Xml
            xmlDoc.Load(vsFichero)
            If lF_bEscribir(xmlDoc, vsSeccion, vsClave, vsValor) = True Then
                xmlDoc.Save(vsFichero)
            End If
        End Sub
    #End Region
        Public Function gF_sEncripta(ByVal sIn As String) As String
            Dim DES As New TripleDESCryptoServiceProvider
            Dim hashMD5 As New MD5CryptoServiceProvider
            Dim lsRetorno As String = String.Empty
            ' Compute the MD5 hash.
            DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(msKey))
            ' Set the cipher mode.
            DES.Mode = CipherMode.ECB
            ' Create the encryptor.
            Dim DESEncrypt As ICryptoTransform = DES.CreateEncryptor()
            ' Get a byte array of the string.
            Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(sIn)
            ' Transform and return the string.
            Try
                lsRetorno = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Catch Exp As System.Security.Cryptography.CryptographicException
                MessageBox.Show(Exp.Message, "gF_sEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "gF_sEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lsRetorno
        End Function
        Public Function gF_sDesEncripta(ByVal sOut As String) As String
            Dim DES As New TripleDESCryptoServiceProvider
            Dim hashMD5 As New MD5CryptoServiceProvider
            Dim lsRetorno As String = Nothing
            ' Compute the MD5 hash.
            DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(msKey))
            ' Set the cipher mode.
            DES.Mode = CipherMode.ECB
            ' Create the decryptor.
            Dim DESDecrypt As ICryptoTransform = DES.CreateDecryptor()
            Dim Buffer As Byte() = Convert.FromBase64String(sOut)
            ' Transform and return the string.
            Try
                lsRetorno = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Catch Exp As System.Security.Cryptography.CryptographicException
                MessageBox.Show(Exp.Message, "gF_sDesEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "gF_sDesEncripta", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Return lsRetorno
        End Function
    End Class

    El Fichero Parametro.xml, tiene el siguiente texto
    =================================================
    <?xml version="1.0" encoding="windows-1252"?>
    <Root>
      <section name="SQL">
        <setting name="Servidor" value=".\SQLEXPRESS">
        </setting>
        <setting name="Base" value="INSPECCION">
        </setting>
      </section>
      <section name="MYSQL">
        <setting name="Servidor" value="localhost">
        </setting>
        <setting name="Base" value="pin">
        </setting>
      </section>
      <section name="ACCESS">
        <setting name="Base" value="D:\Codigo\VB2013\Spire_EXPORT\Spire_EXPORT\bin\Release\PRUEBA.ACCDB">
        </setting>
      </section>
    </Root>

    P.D.

    Espero que te sirva

    Un saludo desde Bilbo
    Carlos

    jueves, 22 de diciembre de 2016 9:22
  • Alberto, muchas gracias por tu interés.

    Mira, como tu dices si internamente eso hacen las funciones get write, pero son del sistema COM.

    Tal ves, no existe mejoras en este aspecto en .NET, y como dicen los detractores de esta plataforma ".NET quiere seguir diciéndoles a los desarrolladores que deben programar no existe libertad", es triste no poder hacer cosas tan simples como estas, como lo aran con vb.net usaran c++ para modificar parte de los archivos cuando uno hace un desarrollo, por que me imagino el problemón si lo hicieran con estas funciones...

    jueves, 22 de diciembre de 2016 23:08
  • J. Carlos, Bendiciones..

    Espectacular tu código, tantas líneas para una pequeñez no crees.

    Estaba recordando cuando desarrollaba en vb6 y manipular el archivo ini de la app eran tan simple, aun que encriptaras datos, en fin.

    Como lo hará el Word, el Excel y los demás productos de Microsoft desarrollados con .NET para guardar parte y un carácter en sus archivos.

    Agradezco tu ayuda J. Carlos, pero no es lo que necesito hacer.

    jueves, 22 de diciembre de 2016 23:18
  • [...] si internamente eso hacen las funciones get write, pero son del sistema COM.

    No, no son COM. Si fueran COM no se podrían declarar con DllImport y requerirían añadir una Referencia para que se genere el Runtime Callable Wrapper para conectar mediante COM/Interop. En su lugar, son puntos de entrada directos a las APIs que se pueden invocar mediante Platform/Invoke, sin atravesar en ningún momento el subsistema COM.
    viernes, 23 de diciembre de 2016 8:51
  • Para leer:

            archivo= ruta + "eltexto.txt"
            Dim MiTexto = IO.File.ReadAllLines(archivo)

            For Each linea As String In MiTexto
               'aqui traes una linea en cada vuelta, ya tu sabes que haces con el texto

                'linea es la variable que contiene el texto leido

            Next

    para escribir:

            archivo= ruta + "eltexto.txt"
             FileOpen(2, archivo, OpenMode.Output)

            Print(2, Space(35) + Today().ToLongDateString)
            Print(2, vbNewLine)
            Print(2, StrDup(80, "*"))
            Print(2, vbNewLine)

            Print(2, "Cualquier texto")

            FileClose(2)

    Así como use el canal 2 para escribir puedes usar el 1,2,3,4.... etc

    Saludos

    Si te sirve marcalo como respuesta correcta


    viernes, 23 de diciembre de 2016 16:15
  • Estimado Alberto.

    Primero, quiero darte muchas bendiciones a ti y tu familia, que esta fiesta de navidad sea llena de amor y paz.

    Alberto, mira agradezco mucho tus comentarios y ayudas en este problema y en otros. Como te comente anteriormente no quiero usarlas, por que si no mejor sigo programando en vb6 u otro lenguaje si voy a usar funciones antiguas, y no quiero depender de algo que Microsoft puedo en cualquier momento dejar obsoleto.

    Muchas gracias por tu ayuda.

    sábado, 24 de diciembre de 2016 3:00
  • Muchas Bendiciones gasgdl2.

    Primero, Que esta navidad puedas disfrutar con los tuyos el amor y la paz, y puedas ver en tu corazón cuanto te ama Dios.

    Mira, esto no lo había leído déjame leer sobre esto y te comento como me fue. Si todo bien marco tu respuesta...

    sábado, 24 de diciembre de 2016 4:29