Obtenir la longueur de Streamreader
Comment puis-je obtenir la longueur d'une StreamReader
, comme je sais que rien ne sera écrit plus.
J'ai pensé que peut-être je pourrais passer toutes les données d'un MemoryStream
, qui a une méthode appelée Length
, mais je suis coincé sur la façon d'ajouter un byte[] pour un MemoryStream
.
private void Cmd(string command, string parameter, object stream)
{
StreamWriter writer = (StreamWriter)stream;
StreamWriter input;
StreamReader output;
Process process = new Process();
try
{
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.FileName = "cmd";
process.Start();
input = process.StandardInput;
output = process.StandardOutput;
input.WriteLine(command + " " + parameter);
input.WriteLine("exit");
using (MemoryStream ms = new MemoryStream())
{
int length = 1024;
char[] charbuffer = new char[length];
byte[] bytebuffer = new byte[length];
while (!output.EndOfStream)
{
output.Read(charbuffer, 0, charbuffer.Length);
for (int i = 0; i < length; i++)
{
bytebuffer[i] = Convert.ToByte(charbuffer[i]);
}
//append bytebuffer to memory stream here
}
long size = ms.Length;
writer.WriteLine(size);
writer.Flush(); //send size of the following message
//send message
}
}
catch (Exception e)
{
InsertLog(2, "Could not run CMD command");
writer.WriteLine("Not valid. Ex: " + e.Message);
}
writer.Flush();
}
Alors, comment puis-je dinamically ajouter un byte[] pour un MemoryStream?
Il est de toute façon mieux que cela pour obtenir la longueur de output
afin que je puisse avertir l'autre extrémité de la taille du message qui sera envoyé?
Qu'entendez-vous par
Lorsque l'on se réfère à tous les deux, je voulais dire la quantité d'octets/caractères sur les variables respectifs.
Je ne comprends pas.. vous avez de la longueur de la
Mais vous êtes en boucle au-dessus du ruisseau jusqu'à
encore une remarque, en ajoutant à ma réponse, vous pouvez utiliser
size
ou par length
?Lorsque l'on se réfère à tous les deux, je voulais dire la quantité d'octets/caractères sur les variables respectifs.
Je ne comprends pas.. vous avez de la longueur de la
bytebuffer
.. pourquoi ne pas l'utiliser?Mais vous êtes en boucle au-dessus du ruisseau jusqu'à
EOF
.. et de stockage tout en bytebuffer
.encore une remarque, en ajoutant à ma réponse, vous pouvez utiliser
m.WriteByte
méthode pour écrire chaque octet dans l' MemoryStream
à la fois. Cela vous permettrait d'éliminer la bytebuffer
à tous.
OriginalL'auteur Bruno Klein | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
MemoryStream
a MemoryStream.La Méthode D'Écriture , qui écrit un tableau d'octets dans le flux:Donc, vous pouvez l'appeler pour en ajouter une autre partie des octets dans le flux de sortie. Cependant, rappelez-vous, pour être en mesure de lire le
MemoryStream
après toutes les opérations d'écriture sont sur, vous allez avoir à utiliser MemoryStream.Méthode De Recherche pour définir la position dans l'état actuel des flux à son début:C'est l'approche la plus facile. De cousre, vous pouvez les déplacer de manière dynamique à travers le ruisseau, lors de la lecture/écriture. Mais qui peuvent être sujettes à erreur.
Pour obtenir la longueur du cours d'eau, c'est à dire
ms.Length
, vous n'avez pas à chercher le début du flux.Je pense qu'il vaut la peine de noter, que si
bytebuffer
est utilisé uniquement pour stocker des octets avant de les copier dans leMemoryStream
, vous pouvez utiliser MemoryStream.WriteByte Méthode à la place. Ce serait vous permettent d'abolirbytebuffer
à tous.OriginalL'auteur horgh
Fait ce travail pour vous?
OriginalL'auteur Steve Sims
Stream Longueur bien, mais va lever une exception si le flux de données ne prend pas en charge les opérations de recherche. Un flux réseau par exemple, une exception sera levée si vous essayez de lire .Longueur. Dans votre code, vous êtes de traitement d'un flux d'entrée d'un processus. Considérez si c'était saisie de l'utilisateur - comment voulez-vous savoir la longueur jusqu'à ce que vous avez été complètement fini de lire?
Si vous êtes à la lecture d'un fichier, vous pouvez obtenir la longueur avec stream.Longueur.
Dans .NET 4+, vous pouvez copier un flux à un autre avec Stream.CopyTo, par exemple:
Vous pouvez également charger les octets en mémoire avec:
CopyTo
dans le but de copieroutput
àms
.les deux paramètres sont des cours d'eau, par exemple, stream.CopyTo(someOtherStream). Votre
output
variable est un StreamReader. Voir: gist.github.com/25eb147ef11305171b20Apparemment
StreamReader
ne dispose pas d'une méthode appeléeCopyTo
.OriginalL'auteur drch