2010-06-29 5 views
1

J'essaie de trouver un moyen de lire une partie d'un flux. J'ai un flux avec 40000 octets et j'ai besoin de lire seulement de la position 8000 à 15000, probablement quelque chose de facile mais je n'arrive pas à trouver un moyen facile d'obtenir un segment de flux.. Segment de lecture de flux .Net d'un flux

+0

Avez-vous besoin de passer ce segment à un autre morceau de code qui attend un flux contenant uniquement le segment de données? Par exemple, vous avez placé un fichier .PNG dans un autre fichier et souhaitez utiliser Image.FromStream ou similaire pour charger le fichier PNG, mais en le passant, le flux entier échoue. Vous voulez donc qu'un nouvel objet semblable à un flux donne uniquement accès au fichier. Contenu PNG? –

Répondre

0

Depuis la lecture d'une partie du flux devrait être assez facile, Je suppose que vous avez réellement besoin d'un nouvel objet Stream qui accède uniquement au segment donné du flux sous-jacent.

ie. vous voulez quelque chose comme ceci:

Stream segment = new StreamSegment(underlyingStream, 8000, 7000); 

J'ai une telle classe, et vous pouvez le trouver ici: LVK.IO.PartialStream. Il s'appuie sur d'autres classes de ma bibliothèque de classe, en particulier LVK.IO.WrapperStream, mais vous pouvez tout trouver là-bas, il suffit de saisir les quelques fichiers dont vous avez réellement besoin (si vous décidez de les utiliser.)

Pour l'utiliser, vous devez spécifiez si votre objet PartialStream possède le flux sous-jacent. Si c'est le cas, lorsque vous disposez de l'objet PartialStream, il disposera également du flux sous-jacent.

Pour l'exemple ci-dessus: (. Ou passer true comme second paramètre)

Stream segment = new PartialStream(underlyingStream, false, 8000, 7000); 

en supposant qu'il ne doit pas posséder le flux sous-jacent

Notes:

  • Construire la Au-dessus de l'objet PartialStream va repositionner le flux sous-jacent au début de ce segment (position 8000 dans l'exemple ci-dessus.)
  • Vous ne devez pas utiliser le flux sous-jacent lorsque vous utilisez l'objet de flux partiel, car il existe une comptabilité interne liée à la position à l'intérieur du segment. Si vous repositionnez le flux sous-jacent sans passer par le flux partiel, le comportement n'est pas défini.
+1

Les liens dans votre réponse semblent être brisés. Avez-vous déplacé le projet ailleurs? –

2

Si la recherche de soutien de flux, vous pouvez simplement passer à la position, sinon vous devez lire le flux pour arriver à cette position:

if (theStream.CanSeek) { 
    theStream.Seek(8000, SeekOrigin.Current); 
} else { 
    // read 8000 bytes and throw away 
} 
// read the 7000 bytes to keep