获取Streamreader的长度

如何获得StreamReader的长度,因为我知道不会再写入任何内容了。 我想也许我可以将所有数据传递给MemoryStream ,它有一个名为Length的方法,但我不知道如何将一个byte []附加到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(); } 

那么,我怎样才能将一个byte []附加到MemoryStream? 有没有比这更好的方法来获得output的长度,所以我可以警告另一端有关将要发送的消息的大小?

MemoryStream有MemoryStream.Write方法 ,它将一个字节数组写入流:

 ms.Write(bytebuffer,0,bytebuffer.Length); 

因此,您可以调用它将另一部分字节添加到输出流。 但请记住,为了能够在所有写操作结束后从MemoryStream读取,您必须使用MemoryStream.Seek方法将当前流中的位置设置为其开头:

 //all write operations ms.Seek(0, SeekOrigin.Begin); //now ready to be read 

这是最简单的方法。 对于你来说,你可以在阅读/写作时动态地在流中移动。 但这可能容易出错。

要获得流的长度,即ms.Length ,您不必寻找流的ms.Length

我想,值得注意的是,如果bytebuffer仅用于在将字节复制到MemoryStream之前存储字节,则可以使用MemoryStream.WriteByte方法 。 这可以让你取消bytebuffer

 for (int i = 0; i < length; i++) { ms.WriteByte(Convert.ToByte(charbuffer[i])); } 

Stream具有Length属性,但如果流不支持搜索操作,则会抛出exception。 例如,如果您尝试读取.Length,网络流将抛出exception。 在您的代码中,您正在处理流程的输入流。 考虑一下这是否是用户输入 – 在完成阅读之前你怎么知道长度?

如果您正在读取文件,则可以使用stream.Length获取长度。

在.NET 4+中,您可以使用Stream.CopyTo将一个流复制到另一个流,例如:

 inputStream.CopyTo(outputStream); 

您还可以使用以下命令将字节加载到内存中:

 byte[] data; using (var ms = new MemoryStream()) { stream.CopyTo(ms); data = ms.ToArray(); } 

这对你有用吗?

  StreamReader sr = new StreamReader(FilePath); long x = sr.BaseStream.Length;