我怎样才能获得StreamReader
的长度,因为我知道不会再写任何东西了。
我想也许我可以将所有数据传递给MemoryStream
,其中有一个名为Length
的方法,但我仍然坚持如何将一个byte []附加到MemoryStream
。< / p>
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
的长度所以我可以警告另一端有关将要发送的消息的大小?
答案 0 :(得分:4)
这对你有用吗?
StreamReader sr = new StreamReader(FilePath);
long x = sr.BaseStream.Length;
答案 1 :(得分:3)
Stream具有Length属性,但如果流不支持搜索操作,则会抛出异常。例如,如果您尝试读取.Length,网络流将抛出异常。在您的代码中,您正在处理流程的输入流。考虑一下这是否是用户输入 - 在完成阅读之前你怎么知道它的长度?
如果您正在阅读文件,可以使用stream.Length获得长度。
在.NET 4+中,您可以使用Stream.CopyTo将一个流复制到另一个流,例如:
inputStream.CopyTo(outputStream);
您还可以使用以下命令将字节加载到内存中:
byte[] data;
using (var ms = new MemoryStream())
{
stream.CopyTo(ms);
data = ms.ToArray();
}
答案 2 :(得分:1)
MemoryStream
有MemoryStream.Write Method ,它将一个字节数组写入流:
ms.Write(bytebuffer,0,bytebuffer.Length);
因此,您可以调用它将另一部分字节添加到输出流中。但请记住,要在所有写入操作结束后能够从MemoryStream
读取,您必须使用MemoryStream.Seek Method 将当前流中的位置设置为其开头:
//all write operations
ms.Seek(0, SeekOrigin.Begin);
//now ready to be read
这是最简单的方法。对于cousre,您可以在读取/写入时动态地移动流。但这可能容易出错。
要获得流的长度,即ms.Length
,您不必寻找流的开头。
我想,值得注意的是,如果bytebuffer
仅用于存储字节,然后再将其复制到MemoryStream
,则可以使用MemoryStream.WriteByte Method代替bytebuffer
。这可以让你废除for (int i = 0; i < length; i++)
{
ms.WriteByte(Convert.ToByte(charbuffer[i]));
}
。
{{1}}