【问题标题】:Get length of Streamreader获取 Streamreader 的长度
【发布时间】:2013-02-01 00:09:52
【问题描述】:

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

那么,我如何动态地将一个字节[] 附加到 MemoryStream 中? 有什么比这更好的方法来获得output 的长度,这样我就可以警告另一端将要发送的消息的大小?

【问题讨论】:

  • sizelength是什么意思?
  • 当提到它们时,我指的是各自变量上的字节/字符的数量。
  • 我不明白.. 你有bytebuffer.. 的长度。为什么不直接使用呢?
  • @BrunoKlein 但是您在流上循环直到EOF.. 并将所有内容存储在bytebuffer
  • @BrunoKlein 再说一句,附加到我的回答中,您可以使用m.WriteByte 方法将每个字节一次写入MemoryStream。这将使您完全消除bytebuffer

标签: c# streamreader memorystream


【解决方案1】:

这对你有用吗?

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

【讨论】:

  • 异常消息:“流不支持搜索。”
【解决方案2】:

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();
}

【讨论】:

  • 你能举个例子吗?因为我不能使用CopyTooutput 复制到ms
  • @BrunoKlein 两个参数都是流,例如 stream.CopyTo(someOtherStream)。您的 output 变量是 StreamReader。见:gist.github.com/25eb147ef11305171b20
  • 显然StreamReader 没有名为CopyTo 的方法。
【解决方案3】:

MemoryStreamMemoryStream.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

这是最简单的方法。当然,您可以在读/写时在流中动态移动。但这可能容易出错。

要获取流的长度,即ms.Length,您不必寻找流的开头。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多