5

StreamReaderもう何も書き込まれないことがわかっているので、 a の長さを取得するにはどうすればよいですか。MemoryStreamというメソッドを持つ a にすべてのデータを渡すことができるのではないかと考えましたLengthが、 byte[] を a に追加する方法に行き詰まりました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送信されるメッセージのサイズについて相手に警告できるように、これよりも長さを取得するためのより良い方法はありますか?

4

3 に答える 3

4

ストリームにはLengthプロパティがありますが、ストリームがシーク操作をサポートしていない場合は例外がスローされます。たとえば、.Length を読み取ろうとすると、ネットワーク ストリームは例外をスローします。コードでは、プロセスの入力ストリームを処理しています。それがユーザー入力であるかどうかを考えてみてください。完全に読み終わるまでの長さをどのように知ることができますか?

ファイルを読み込んでいる場合は、stream.Length で長さを取得できます。

.NET 4+ では、Stream.CopyTo を使用して、あるストリームを別のストリームにコピーできます。次に例を示します。

inputStream.CopyTo(outputStream);

次のコマンドを使用して、バイトをメモリにロードすることもできます。

byte[] data;
using (var ms = new MemoryStream())
{
    stream.CopyTo(ms);
    data = ms.ToArray();
}
于 2013-02-01T00:23:36.267 に答える
1

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、ストリームの開始を探す必要はありません。

bytebufferにコピーする前にバイトを格納するためだけに使用される場合は、代わりにMemoryStream.WriteByteメソッドMemoryStreamを使用できることに注意してください。これはあなたに全く廃止させるでしょう。bytebuffer

for (int i = 0; i < length; i++)
{
    ms.WriteByte(Convert.ToByte(charbuffer[i]));
}
于 2013-02-01T00:18:53.910 に答える