Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


8.15. Escribir en un fichero binario

Para escribir en un FileStream, usaremos órdenes similares a las que empleábamos para leer de él:

Además, a la hora de abrir el fichero, tenemos dos alternativas:

Vamos a ver un ejemplo que junte todo ello: crearemos un fichero, guardaremos datos, lo leeremos para comprobar que todo es correcto, añadiremos al final, y volveremos a leer:

// Ejemplo_08_15a.cs
// Ficheros binarios: escritura en FileStream
// Introducción a C#, por Nacho Cabanes

using System;
using System.IO;

public class Ejemplo_08_15a
{
    const int TAMANYO_BUFFER = 10;

    public static void Main()
    {
        FileStream fichero;
        string nombre;
        byte[] datos;

        nombre = "datos.dat";
        datos = new byte[TAMANYO_BUFFER];

        // Damos valores iniciales al array
        for (byte i=0; i

(Nota: existe una propiedad "CanWrite" que nos permite saber si se puede escribir en el fichero).

Si queremos que escribir datos básicos de C# (float, int, etc.) en vez de un array de bytes, podemos usar un "BinaryWriter", que se maneja de forma similar a un "BinaryReader", con la diferencia de que no tenemos métodos WriteByte, WriteString y similares, sino un único método "Write", que se encarga de escribir el dato que le indiquemos, sea del tipo que sea:

// Ejemplo_08_15b.cs
// Ficheros binarios: escritura en BinaryWriter
// Introducción a C#, por Nacho Cabanes

using System;
using System.IO;

public class Ejemplo_08_15b
{
    public static void Main()
    {
        BinaryWriter ficheroSalida;
        BinaryReader ficheroEntrada;
        string nombre;
        
        // Los datos que vamos a guardar/leer
        byte unDatoByte;
        int unDatoInt;
        float unDatoFloat;
        double unDatoDouble;
        string unDatoString;

        Console.Write("Introduzca el nombre del fichero a crear: ");
        nombre = Console.ReadLine();

        Console.WriteLine("Creando fichero...");
        // Primero vamos a grabar datos
        try 
        {      
            ficheroSalida = new BinaryWriter(
            File.Open(nombre, FileMode.Create));
            unDatoByte = 1;
            unDatoInt = 2;
            unDatoFloat = 3.0f;
            unDatoDouble = 4.0;
            unDatoString = "Hola";      
            ficheroSalida.Write(unDatoByte);
            ficheroSalida.Write(unDatoInt);
            ficheroSalida.Write(unDatoFloat);
            ficheroSalida.Write(unDatoDouble);
            ficheroSalida.Write(unDatoString);
            ficheroSalida.Close();    
        } 
        catch (Exception e)
        {
            Console.WriteLine("Problemas al crear: "+e.Message);
            return;
        }

        // Ahora vamos a leerlos
        Console.WriteLine("Leyendo fichero...");
        try 
        {
            ficheroEntrada = new BinaryReader(
            File.Open(nombre, FileMode.Open));
            
            unDatoByte = ficheroEntrada.ReadByte();
            Console.WriteLine("El byte leido es un {0}",
                unDatoByte);
                
            unDatoInt = ficheroEntrada.ReadInt32();
            Console.WriteLine("El int leido es un {0}",
                unDatoInt);
                
            unDatoFloat = ficheroEntrada.ReadSingle();
            Console.WriteLine("El float leido es un {0}",
                unDatoFloat);
                
            unDatoDouble = ficheroEntrada.ReadDouble();
            Console.WriteLine("El double leido es un {0}",
                unDatoDouble);
                
            unDatoString = ficheroEntrada.ReadString();
            Console.WriteLine("El string leido es \"{0}\"",
                unDatoString);
            Console.WriteLine("Volvamos a leer el int...");
            
            ficheroEntrada.BaseStream.Seek(1, SeekOrigin.Begin);
                unDatoInt = ficheroEntrada.ReadInt32();
            Console.WriteLine("El int leido es un {0}",
                unDatoInt);
            ficheroEntrada.Close();    
        } 
        catch (Exception e)
        {
            Console.WriteLine("Problemas al leer: "+e.Message);
            return;
        }
    }
}

El resultado de este programa es:

Introduzca el nombre del fichero a crear: 1234
Creando fichero...
Leyendo fichero...
El byte leido es un 1
El int leido es un 2
El float leido es un 3
El double leido es un 4
El string leido es "Hola"
Volvamos a leer el int...
El int leido es un 2

En este caso hemos usado "FileMode.Create" para indicar que queremos crear el fichero, en vez de abrir un fichero ya existente. Los modos de fichero que podemos emplear en un BinaryReader o en un BinaryWriter son los siguientes:

  • CreateNew: Crear un archivo nuevo. Si existe, se produce una excepción IOException.
  • Create: Crear un archivo nuevo. Si ya existe, se sobrescribirá.
  • Open: Abrir un archivo existente. Si el archivo no existe, se produce una excepción System.IO.FileNotFoundException.
  • OpenOrCreate: Se debe abrir un archivo si ya existe; en caso contrario, debe crearse uno nuevo.
  • Truncate: Abrir un archivo existente y truncarlo para que su tamaño sea de cero bytes.
  • Append: Abre el archivo si existe y se desplaza hasta el final del mismo, o crea un archivo nuevo si no existe.

Ejercicios propuestos:

Ejercicio propuesto 8.15.1: Crea una copia de un fichero EXE. La copia debe tener el mismo nombre y extensión BAK.
Ejercicio propuesto 8.15.2: Crea un programa que "encripte" el contenido de un fichero BMP, volcando su contenido a un nuevo fichero, en el que intercambiará los dos primeros bytes. Para desencriptar, bastará con volver a intercambiar esos dos bytes, volcando a un tercer fichero.