12
votes

Limitation de la méthode de lecture / écriture filaire

La méthode de lecture / écriture de FileStream peut prendre uniquement une valeur entier en tant que longueur. Mais filtream L'objet retourne la longueur dans long . Dans ce cas, si la taille de fichier est plus grande que la valeur entier (environ plus de 2 Go). Ensuite, comment la méthode de lecture / écriture de FileStream longue valeur.


0 commentaires

3 Réponses :


13
votes

Alors vous lisez et écrivez dans plusieurs morceaux. Le CLR a une limite de la taille de tout objet particulier de toute façon (aussi autour de 2 Go IIRC, même sur un CLR 64 bits), de sorte que vous ne pouviez pas avoir un tableau d'octet suffisant pour que cela soit un problème.

vous Devrait toujours boucler lors de la lecture de toute façon, comme vous ne pouvez pas garantir qu'un appel de lecture lira autant d'octets que vous l'avez demandé, même s'il y a plus de données à venir. P>

EDIT: Lecture en morceaux: P >

byte[] buffer = new byte[1024 * 32];
int bytesRead;

while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Use the data you've read
}


4 commentaires

Cher, s'il vous plaît fournir un exemple de lecture et d'écriture dans des morceaux.


@jams: ont édité ma réponse, mais il est difficile de donner du code concret sans savoir ce que vous faites avec les données.


En fait, je dois lire et écrire un fichier vidéo de HDD, la taille de l'OMS est de plus de 2 Go. Je suis confronté à la difficulté de comprendre votre exemple pour les morceaux en lecture / écriture. Mais ce n'est pas un problème que je vais le gérer.


Cher @jonskeet tu es un joyau. Lorsque je vous demande de vous donner l'exemple, je m'attendais à ce que vous ne le fournissiez pas, car la plupart des membres de haute direction se comportent donc rudement à de telles demandes idiotes. Mais vous l'avez fourni parce que vous avez un cœur gentil et vous êtes un véritable messieurs. Je souhaite que vous achetiez très bientôt des points de réputation de 300 000 points de réputation.



0
votes

Autant que je sache, vous pouvez toujours utiliser chercher pour aller à la bonne position dans le flux.

Vous devrez probablement vous boucler, et si vous voulez lire plus de 2 concerts, vous aurez besoin de boucle ici aussi


0 commentaires

4
votes

Il n'est pas nécessaire d'écrire directement plus de 2 Go de données dans un appel

Si vous auriez vraiment la mise en mémoire tamponnée contiguë dans la mémoire (? MABY comme un homologuée intégré inadyelessmemorystream pour mettre en œuvre un vidage de base?) Vous pourriez facilement Batch l'écriture dans plusieurs appels. Il sera écrit sur le disque en blocs de 512K à max 4k sur le matériel actuel, de toute façon.

La valeur excellente des interfaces "streaming" est que vous pouvez l'avoir antérieur. En fait, Lorsque vous examinez là-contre, vous constaterez que les matrices CLR (et tout autre) sont réellement liées à 2 Go

Mise à jour

puisque vous avez maintenant avoué Que vous souhaitiez essentiellement copier des flux, vous pourriez être mieux servi avec une solution instantanée. Il y a fichier.copy xxx

ou il y a La réponse standard xxx

n'oublie pas FLUSHING , FERMING et DISCTUIMENT VOS SOUS-STROUXES SE QUOI Si vous gérez les flux manuellement.


1 commentaires

Jeté dans une poignée de conseils utiles en réponse à l'OP Commentaire " En fait, je dois lire et écrire un fichier vidéo de HDD, la taille de l'OMS est plus grand que 2 Go "