Hola
Perdon que te lo diga pero tengo la sensación de que nunca das la información necesaria, o al menos yo nunca soy capaz de entender a la perfección el problema que tienes en las dudas que formulas, espero haber entendido bien lo que pretendes hacer esta vez.
En realidad no necesitas ningún archivo "app.dat" ni manipular el contenido de ningún archivo manuálmente, ya que puedes utilizar la infrastructura settings para almacenar la configuración de usuario, dicha configuración se escribe en un archivo del directorio Roaming pero su manipulación es muy sencilla ya que está orientada a objetos:
➢ Using Settings in C#
De todas formas, si quieres generar un archivo legible/editable entonces dale una extensión común de texto plano, cómo "app.txt" o "app.ini", pero si utilizas la extensión ".dat" eso da a entender al end-user que debería tratarse de un archivo binario con contenido "ilegible", y por ende te sugiero aplicar la serialización de datos:
Primero, diseño el modelo de un objeto/contenedor cómo esta estructura de abajo, que servirá para almacenar los datos:
C#:
Segundo, desarrollo los métodos (genéricos) de serialización y deserialización los cuales me ayudarán a automatizar dicha tarea:
C#:
Por último, lo pongo todo en práctica.
(Si lo necesitases puedes adaptar el ejemplo para serializar también una colección uni o multi dimensional, claro está, aunque dependiendo del tipo de objeto la implementación de una serialización puede requerir más trabajo):
C#:
No estoy seguro de si algo así es lo que pretendías hacer.
Saludos
Perdon que te lo diga pero tengo la sensación de que nunca das la información necesaria, o al menos yo nunca soy capaz de entender a la perfección el problema que tienes en las dudas que formulas, espero haber entendido bien lo que pretendes hacer esta vez.
En realidad no necesitas ningún archivo "app.dat" ni manipular el contenido de ningún archivo manuálmente, ya que puedes utilizar la infrastructura settings para almacenar la configuración de usuario, dicha configuración se escribe en un archivo del directorio Roaming pero su manipulación es muy sencilla ya que está orientada a objetos:
➢ Using Settings in C#
De todas formas, si quieres generar un archivo legible/editable entonces dale una extensión común de texto plano, cómo "app.txt" o "app.ini", pero si utilizas la extensión ".dat" eso da a entender al end-user que debería tratarse de un archivo binario con contenido "ilegible", y por ende te sugiero aplicar la serialización de datos:
Primero, diseño el modelo de un objeto/contenedor cómo esta estructura de abajo, que servirá para almacenar los datos:
Código (vbnet) [Seleccionar]
''' <summary>
''' Structure that specifies the application configuration.
''' </summary>
<SerializableAttribute>
Public Structure ConfigStruct
''' <summary>
''' </summary>
Public Auth As String
''' <summary>
''' </summary>
Public Logi As String
''' <summary>
''' </summary>
Public Calc As String
''' <summary>
''' </summary>
Public Hola As String
''' <summary>
''' </summary>
Public Mens As String
''' <summary>
''' </summary>
Public Entr As String
''' <summary>
''' </summary>
Public Para As String
End Structure
C#:
Código (csharp) [Seleccionar]
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
/// <summary>
/// Structure that specifies the application configuration.
/// </summary>
[SerializableAttribute()]
public struct ConfigStruct
{
/// <summary>
/// </summary>
public string Auth;
/// <summary>
/// </summary>
public string Logi;
/// <summary>
/// </summary>
public string Calc;
/// <summary>
/// </summary>
public string Hola;
/// <summary>
/// </summary>
public string Mens;
/// <summary>
/// </summary>
public string Entr;
/// <summary>
/// </summary>
public string Para;
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Segundo, desarrollo los métodos (genéricos) de serialización y deserialización los cuales me ayudarán a automatizar dicha tarea:
Código (vbnet) [Seleccionar]
Imports System.Runtime.Serialization.Formatters.Binary
''' <summary>
''' Exposes members for binary serialization.
''' </summary>
Public NotInheritable Class BinarySerializerUtil
''' <summary>
''' Serializes an object into the specified file, using binary serialization.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="object">The object to serialize.</param>
''' <param name="filepath">The filepath to save the obstore the serialized data.</param>
Public Shared Sub Serialize(Of T)(ByVal [object] As T,
ByVal filepath As String)
Dim serializer As New BinaryFormatter
Using writer As New FileStream(filepath, FileMode.Create)
serializer.Serialize(writer, [object])
End Using
End Sub
''' <summary>
''' Deserializes an Object from the specified file, using binary deserialization.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="object">The ByRefered object to store the deserialized data.</param>
''' <param name="filepath">The filepath to deserialize its contents.</param>
Public Shared Sub Deserialize(Of T)(ByRef [object] As T,
ByVal filepath As String)
Dim serializer As New BinaryFormatter
Using reader As New FileStream(filepath, FileMode.Open)
[object] = DirectCast(serializer.Deserialize(reader), T)
End Using
End Sub
End Class
C#:
Código (csharp) [Seleccionar]
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
/// <summary>
/// Exposes members for binary serialization.
/// </summary>
public sealed class BinarySerializerUtil
{
/// <summary>
/// Serializes an object into the specified file, using binary serialization.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="object">The object to serialize.</param>
/// <param name="filepath">The filepath to save the obstore the serialized data.</param>
public static void Serialize<T>(T @object, string filepath)
{
BinaryFormatter serializer = new BinaryFormatter();
using (FileStream writer = new FileStream(filepath, FileMode.Create)) {
serializer.Serialize(writer, @object);
}
}
/// <summary>
/// Deserializes an Object from the specified file, using binary deserialization.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="object">The ByRefered object to store the deserialized data.</param>
/// <param name="filepath">The filepath to deserialize its contents.</param>
public static void Deserialize<T>(ref T @object, string filepath)
{
BinaryFormatter serializer = new BinaryFormatter();
using (FileStream reader = new FileStream(filepath, FileMode.Open)) {
@object = (T)serializer.Deserialize(reader);
}
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Por último, lo pongo todo en práctica.
(Si lo necesitases puedes adaptar el ejemplo para serializar también una colección uni o multi dimensional, claro está, aunque dependiendo del tipo de objeto la implementación de una serialización puede requerir más trabajo):
Código (vbnet) [Seleccionar]
Imports System.IO
Public Class Form1
''' <summary>
''' The filepath where to serialize de data.
''' </summary>
Private ReadOnly datFilePath As String = Path.Combine(Application.StartupPath, "app.dat")
''' <summary>
''' A <see cref="ConfigStruct"/> instance that specifies the application config.
''' </summary>
Private config As New ConfigStruct With
{
.Auth = "Auth value",
.Calc = "Calc vaule",
.Entr = "Entr vaule",
.Hola = "Hola vaule",
.Logi = "Logi vaule",
.Mens = "Mens vaule",
.Para = "Para vaule"
}
''' <summary>
''' Handles the <see cref="Form.Shown"/> event of this form.
''' </summary>
Private Sub Test() Handles MyBase.Shown
' Serializo los datos de la instancia del objeto, al archivo especificado.
BinarySerializerUtil.Serialize(Of ConfigStruct)(Me.config, datFilePath)
' Limpio los datos del objeto.
Me.config = Nothing
' Deserializo los datos del archivo, a la instancia del objeto especificado.
BinarySerializerUtil.Deserialize(Of ConfigStruct)(Me.config, datFilePath)
Debug.WriteLine(Me.config.Auth)
Debug.WriteLine(Me.config.Calc)
Debug.WriteLine(Me.config.Entr)
Debug.WriteLine(Me.config.Hola)
Debug.WriteLine(Me.config.Logi)
Debug.WriteLine(Me.config.Mens)
Debug.WriteLine(Me.config.Para)
End Sub
End Class
C#:
Código (csharp) [Seleccionar]
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
public class Form1
{
/// <summary>
/// The filepath where to serialize de data.
/// </summary>
private readonly string datFilePath = Path.Combine(Application.StartupPath, "app.dat");
/// <summary>
/// A <see cref="ConfigStruct"/> instance that specifies the application config.
/// </summary>
private ConfigStruct config = new ConfigStruct {
Auth = "Auth value",
Calc = "Calc vaule",
Entr = "Entr vaule",
Hola = "Hola vaule",
Logi = "Logi vaule",
Mens = "Mens vaule",
Para = "Para vaule"
};
/// <summary>
/// Handles the <see cref="Form.Shown"/> event of this form.
/// </summary>
private void Test()
{
// Serializo los datos de la instancia del objeto, al archivo especificado.
BinarySerializerUtil.Serialize<ConfigStruct>(this.config, datFilePath);
// Limpio los datos del objeto.
this.config = null;
// Deserializo los datos del archivo, a la instancia del objeto especificado.
BinarySerializerUtil.Deserialize<ConfigStruct>(this.config, datFilePath);
Debug.WriteLine(this.config.Auth);
Debug.WriteLine(this.config.Calc);
Debug.WriteLine(this.config.Entr);
Debug.WriteLine(this.config.Hola);
Debug.WriteLine(this.config.Logi);
Debug.WriteLine(this.config.Mens);
Debug.WriteLine(this.config.Para);
}
public Form1()
{
Shown += Test;
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
No estoy seguro de si algo así es lo que pretendías hacer.
Saludos