web-dev-qa-db-fra.com

c # - Lire des octets spécifiques d'un fichier

Existe-t-il un moyen de lire des octets spécifiques à partir d'un fichier?

Par exemple, j'ai le code suivant pour lire tous les octets du fichier

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

Je veux lire les octets du décalage 50 au décalage 60 et les mettre dans un tableau.

30
Ahmed M. Taher

Version LINQ:

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

Créez un lecteur binaire, lisez 10 octets à partir de l'octet 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);
}
51
Robert Rouhani

Cela devrait le faire

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);
}

À la fin, data contiendrait 10 octets entre le décalage du fichier de 50 et 60, et actualRead contiendrait un nombre compris entre 0 et 10, indiquant le nombre d'octets réellement lus (cela est intéressant lorsque le fichier contient au moins 50 mais moins de 60 octets). Si le fichier est inférieur à 50 octets, vous verrez EndOfStreamException.

28
dasblinkenlight

Tu dois:

  • rechercher les données que vous souhaitez
  • appelez Lecture à plusieurs reprises, en vérifiant la valeur de retour, jusqu'à ce que vous ayez toutes les données dont vous avez besoin

Par exemple:

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;     
    }
}
2
Marc Gravell
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;
 }
1
DonCallisto

Vous pouvez utiliser filestream puis appeler read

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);
}

Vérifiez cet exemple MSDN

1
oqx