Manejo de ficheros binarios

Ficheros binarios

Suelen ser ficheros de imágenes, audio, video, etc.

...
BinaryReader fichero;
string nombre;
byte unDato;
...
try {
  fichero = new BinaryReader(File.Open(nombre, FileMode.Open));
  unDato = fichero.ReadByte();
  fichero.Close();
}
...

Con un fichero binario podemos leer cualquier tipo de dato:

  1. ReadInt32: lee un int.
  2. ReadSingle: lee un float.
  3. ReadString: lee una cadena.

Lectura de bloques de datos de un fichero binario.

...
FileStream fichero;
string nombre;
byte[] datos;
int cantidadLeida;
...

try {
  fichero = File.OpenRead (nombre);
  datos = new byte[10];
  int posicion = 0;
  int cantidadALeer = 10;
  cantidadLeida = fichero.read(datos, posicion, cantidadALeer);
  ...
  fichero.Close();
}
...

La posición en el fichero

FileStream fichero;
...
try {
  ...
  if (fichero.Lenght>30) {
    fichero.Seek(19, SeekOrigin.Begin);
    int nuevoDato = fichero.ReadByte();
    Console.WriteLine("El byte 20 es un {0}",nuevoDato);
    Console.WriteLine("La posición actual es {0}",fichero.Position);
    ...
   }
...
fichero.Close();

Existe una propiedad CanSeek que nos permite saber si el fichero permite que nos movamos utilizando el método Seek.

Escribir en un fichero binario

...
fichero = File.OpenWrite(nombre);
fichero.Seek(0,SeekOrigin.End);
fichero.Write(datos,0, TAMANYO_BUFFER);
...
// Modificamos el 3º byte
fichero.Seek(2,SeekOrigin.Begin);
fichero.WriteByte(99);
fichero.Close();
...

Existe la propiedad CanWrite que nos permite saber si se puede escribir en el archivo.

Si queremos escribir datos de distinto tipo al Byte podemos utilizar:

  • Write simplemente, no existe WriteString, WriteByte, WriteInt32, …

 

...
BinaryReader ficheroEntrada;
...
try {
  ficheroEntrada = new BinaryReader(File.Open(nombre, FileMode.Open));
  ...
  ficheroEntrada.BaseStream.Seek(1,SeekOrigin.Begin);
  ...
}

FileMode:

  1. CreateNew: Crea un archivo nuevo pero si existe genera una excepción IOException.
  2. Create. Crea un archivo nuevo pero si ya existe se sobreescribe.
  3. Open. Abrir un archivo existente. Sino existiera genera una excepción System,IO.FileNotFoundException.
  4. OpenOrCreate. Abrir el archivo si existe, y sino existe se crea.
  5. Truncate. Abre un archivo existente y deja su tamaño a 0.
  6. Append. Abre el archivo y se coloca al final del mismo, sino existe lo crea.

Leer y escribir en un mismo fichero binario.

Utilizando el objeto FileStream, tiene un método llamado “Open” al que podemos indicarle el modo de apertura (FileMode) y el modo de acceso (FileAccess.Read, FileAccess.Write, o FileAccess.ReadWrite).

 

...
FileStream fichero;
string nombre;
byte[] datos;
...
try {
  fichero = File.Open(nombre, FileMode.Open,FileAccess.ReadWrite);
  ...
  fichero.Close();
}
...