2011-12-30 30 views
27

¿Hay alguna forma de leer bytes específicos de un archivo?C# - Leer bytes específicos de un archivo

Por ejemplo, tengo el siguiente código para leer todos los bytes del archivo

byte[] test = File.ReadAllBytes(file); 

quiero leer los bytes de desplazamiento 50 para compensar el 60 y ponerlos en una matriz.

Respuesta

12

LINQ Versión:

byte[] test = File.ReadAllBytes(file).Skip(50).Take(10).ToArray(); 
+39

Aquí se leerá todo el contenido del archivo y solo se usarán 10 bytes. El enfoque no es muy bueno :) –

+1

@the_joric Sin embargo, un asistente que con un nombre de archivo devolvió un 'IEnumerable ' perezoso en lugar de 'File.ReadAllBytes' sería un enfoque efectivo, especialmente si la lectura de una ejecución arbitraria de bytes desde un archivo era una necesidad común. – Richard

+7

esto no debería ser la respuesta aceptada – neo112

26

Esto debe hacerlo

var data = new byte[10]; 
int actualRead; 

using (FileStream fs = new FileStream("c:\\MyFile.bin", FileMode.Open)) { 
    fs.Position = 50; 
    actualRead = 0; 
    do { 
     actualRead += fs.Read(data, actualRead, 10-actualRead); 
    } while (actualRead != 10 && fs.Position < fs.Length); 
} 

Al finalizar, data contendría 10 bytes entre el expediente de compensación de 50 y 60, y actualRead contendría un número de 0 a 10, indicando cómo se leen realmente muchos bytes (esto es de interés cuando el archivo tiene al menos 50 pero menos de 60 bytes). Si el archivo tiene menos de 50 bytes, verá EndOfStreamException.

+1

Usted se entiende para verificar siempre el valor de retorno de Lectura y bucle según sea necesario. Es legal que Read regrese 1 incluso cuando otros 20000 bytes están disponibles. –

+0

de FilStream.Lea en MSDN: "Una implementación es gratuita para devolver menos bytes de los solicitados, incluso si no se ha llegado al final de la secuencia". –

+0

Lo importante es: la documentación explícitamente reservó ese derecho: así que, yo no, no está siguiendo la API publicada –

1
using System.IO; 

public static byte[] ReadFile(string filePath) 
{ 
    byte[] buffer; 
    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
    try 
    { 
     buffer = new byte[length];   // create buffer 
     fileStream.Read(buffer, 50, 10); 
    } 
    finally 
    { 
     fileStream.Close(); 
    } 
    return buffer; 
} 
+2

El "desplazamiento" en la llamada a Leer es el desplazamiento ** en el búfer **, no el desplazamiento en la corriente –

31

Crear un BinaryReader, leen 10 bytes a partir del byte 50:

byte[] test = new byte[10]; 
using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open))) 
{ 
    reader.BaseStream.Seek(50, SeekOrigin.Begin); 
    reader.Read(test, 0, 10); 
} 
+1

El método Stream.Seek toma dos argumentos. Debería ser 'reader.BaseStream.Seek (50, SeekOrigin.Begin);' – Tajomaru

+0

Buena captura, arreglada. –

+1

mejor y más simple respuesta! gracias – knocte

-3
byte[] a = new byte[60]; 
byte[] b = new byte[10]; 
Array.Copy(a ,50, b , 0 , 10); 
+0

-1: La Q trata sobre la lectura de bytes desde un * archivo *. – Richard

+0

SOLO porque editó la pregunta ... En el PO esto no estaba claro. – Adrian

+0

Te sugiero que mires mi edición. El requisito de archivo estaba allí (y no cambié el título). – Richard

1

Usted puede utilizar filestream a y luego llamar a leer

string pathSource = @"c:\tests\source.txt"; 

using (FileStream fsSource = new FileStream(pathSource, 
    FileMode.Open, FileAccess.Read)) 
{ 

    // Read the source file into a byte array. 
    byte[] bytes = new byte[fsSource.Length]; 
    int numBytesToRead = 10; 
    int numBytesRead = 50; 
    // Read may return anything from 0 to numBytesToRead. 
    int n = fsSource.Read(bytes, numBytesRead, numBytesToRead); 
} 

Check this example MSDN

+0

numBytesRead es el desplazamiento, los argumentos van (buffer, offset, recuento) – oqx

+0

Tiene razón, quitando el voto. – Richard

+0

muchas gracias :) – oqx

2

Necesitas :

  • tratan de los datos que desea
  • llamada de lectura en varias ocasiones, comprobar el valor de retorno, hasta que tenga todos los datos que necesita

Por ejemplo:

public static byte[] ReadBytes(string path, int offset, int count) { 
    using(var file = File.OpenRead(path)) { 
     file.Position = offset; 
     offset = 0; 
     byte[] buffer = new byte[count]; 
     int read; 
     while(count > 0 && (read = file.Read(buffer, offset, count)) > 0) 
     { 
      offset += read; 
      count -= read; 
     } 
     if(count < 0) throw new EndOfStreamException(); 
     return buffer;  
    } 
} 
Cuestiones relacionadas