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.12. La posición en el fichero

Cuando leemos byte a byte (y también a veces en el caso de leer todo un bloque), habitualmente nos interesará situarnos antes en la posición exacta en la que se encuentra el dato que nos interesa leer. En un fichero binario, esto podemos conseguirlo sin necesidad de leer todos los bytes anteriores, accediendo directamente a la posición que buscamos (acceso aleatorio).

Para ello, tenemos el método "Seek". A este método se le indican dos parámetros: la posición a la que queremos saltar, y el punto desde el que queremos que se cuente esa posición (desde el comienzo del fichero –SeekOrigin.Begin-, desde la posición actual –SeekOrigin.Current- o desde el final del fichero –SeekOrigin.End-). La posición es un Int64, porque puede ser un número muy grande e incluso un número negativo (si miramos desde el final del fichero, porque desde él habrá que retroceder).

De igual modo, podemos saber en qué posición del fichero nos encontramos, consultando la propiedad "Position" (y también sabemos que podemos obtener la longitud del fichero, mirando su propiedad "Length").

// Ejemplo_08_12a.cs
// Ficheros binarios: posición
// Introducción a C#, por Nacho Cabanes

using System;
using System.IO;

public class Ejemplo_08_12a
{
    public static void Main()
    {
        Console.WriteLine("Introduzca el nombre del fichero");
        string nombre = Console.ReadLine();
        FileStream  fichero = File.OpenRead(nombre);
        byte[] datos = new byte[10];
        int posicion = 0;
        int cantidadALeer = 10;
        int cantidadLeida = fichero.Read(datos, posicion, cantidadALeer);

        if (cantidadLeida < 10)
            Console.WriteLine("No se han podido leer todos los datos!");
        else 
        {
            Console.WriteLine("El primer byte leido es {0}", datos[0]);
            Console.WriteLine("El tercero es {0}", datos[2]);
        }

        if (fichero.Length > 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);
            Console.WriteLine("Y el tamaño del fichero es {0}",
                fichero.Length);    
        }

        fichero.Close();    
    }
}

(Nota: existe una propiedad "CanSeek" que nos permite saber si el fichero que hemos abierto permite realmente que nos movamos a unas posiciones u otras).

Ejercicios propuestos:

Ejercicio propuesto 8.12.1: Abre un fichero con extensión EXE y comprueba si su segundo byte corresponde a una letra "Z", sin leer su primer byte.
Ejercicio propuesto 8.12.2: Abre una imagen en formato BMP y comprueba si está comprimida, mirando el valor del byte en la posición 30 (empezando a contar desde 0). Si ese valor es 0 (que es lo habitual), indicará que el fichero no está comprimido. Salta a esa posición directamente, sin leer toda la cabecera.