PipeStream.Read メソッド

定義

オーバーロード

Read(Span<Byte>)

現在のストリームからバイト シーケンスを読み取り、バイト配列に書き込んで、読み取ったバイト数だけストリーム内の位置を進めます。

Read(Byte[], Int32, Int32)

ストリームからバイトのブロックを読み取り、指定した長さの指定した位置を開始位置として、指定したバッファーにデータを書き込みます。

Read(Span<Byte>)

ソース:
PipeStream.Unix.cs
ソース:
PipeStream.Unix.cs
ソース:
PipeStream.Unix.cs

現在のストリームからバイト シーケンスを読み取り、バイト配列に書き込んで、読み取ったバイト数だけストリーム内の位置を進めます。

public:
 override int Read(Span<System::Byte> buffer);
public override int Read (Span<byte> buffer);
override this.Read : Span<byte> -> int
Public Overrides Function Read (buffer As Span(Of Byte)) As Integer

パラメーター

buffer
Span<Byte>

メモリの領域。 このメソッドが戻ると、この領域のコンテンツは現在のソースから読み取られたバイトに置き換えられます。

戻り値

buffer に読み取る合計バイト数。 現在、多くのバイト数を利用できない場合、これは buffer に割り当てられているバイト数より小さくなります。ストリームの末尾に到達した場合は 0 (ゼロ) になることがあります。

例外

読み取ったバイト数がバッファー長を超えています。

ストリームは読み取りをサポートしません。

閉じたパイプにアクセスできません。

パイプがまだ接続されていません。

- または -

パイプが切断状態になっています。

- または -

パイプ ハンドルがまだ設定されていません。 (PipeStream 実装で InitializeHandle(SafePipeHandle, Boolean, Boolean) を呼び出しましたか?

注釈

プロパティを使用して、 CanRead 現在 PipeStream のオブジェクトが読み取り操作をサポートしているかどうかを判断します。

メソッドを ReadAsync 使用して、現在のストリームから非同期的に読み取ります。

このメソッドは、現在の buffer.Length ストリームから最大バイト数を読み取り、 に buffer格納します。 ストリーム内の現在の位置は、読み取られたバイト数だけ進みます。ただし、例外が発生した場合、ストリーム内の現在の位置は変更されません。

このメソッドは、データが使用できない場合に、少なくとも 1 バイトのデータを読み取ることができるまでブロックします。

このメソッドは、ストリームにこれ以上データがなく、それ以上必要ない場合 (閉じたソケットやファイルの終わりなど) にのみ 0 を返します。

このメソッドは、ストリームの末尾に達していない場合でも、要求されたバイト数よりも少ないバイト数を自由に返します。

プリミティブ データ型の読み取りに使用 BinaryReader します。

適用対象

Read(Byte[], Int32, Int32)

ソース:
PipeStream.Unix.cs
ソース:
PipeStream.Unix.cs
ソース:
PipeStream.Unix.cs

ストリームからバイトのブロックを読み取り、指定した長さの指定した位置を開始位置として、指定したバッファーにデータを書き込みます。

public:
 override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
[System.Security.SecurityCritical]
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
[<System.Security.SecurityCritical>]
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer

パラメーター

buffer
Byte[]

このメソッドが返されるときに、指定したバイト配列の offset から (offset + count - 1) までの値が、現在のソースから読み取られたバイトに置き換えられます。

offset
Int32

読み取られるバイトが配置される buffer 配列内のバイト オフセット。

count
Int32

読み取る最大バイト数。

戻り値

buffer に読み取られる合計バイト数。 要求しただけのバイト数を読み取ることができなかった場合、この値は要求したバイト数より小さくなります。ストリームの末尾に到達した場合は 0 になることがあります。

属性

例外

buffernullです。

offset が 0 未満です。

または

count が 0 未満です。

countbuffer で使用可能なバイト数を超えています。

パイプは閉じています。

パイプが読み取り操作をサポートしていません。

パイプが接続解除されたか、パイプが接続を待機しているか、またはハンドルが設定されていません。

何らかの I/O エラーが発生しました。

次の例では、匿名パイプ クライアントとパイプ サーバーを作成します。 パイプ サーバーでは、 メソッドを Read 使用して、パイプ クライアントから検証コードとして一連のバイトを読み取ります。 パイプ クライアントとパイプ サーバーはどちらも同じ例の一部です。 この例のサーバー部分は、クライアント プロセスを作成し、引数として匿名パイプ ハンドルを渡します。

#using <System.dll>
#using <System.Core.dll>

using namespace System;
using namespace System::IO;
using namespace System::IO::Pipes;
using namespace System::Diagnostics;

ref class PipeStreamExample
{
private:
    static array<Byte>^ matchSign = {9, 0, 9, 0};

public:
    static void Main()
    {
        array<String^>^ args = Environment::GetCommandLineArgs();
        if (args->Length < 2)
        {
            Process^ clientProcess = gcnew Process();

            clientProcess->StartInfo->FileName = Environment::CommandLine;

            AnonymousPipeServerStream^ pipeServer =
                gcnew AnonymousPipeServerStream(PipeDirection::In,
                HandleInheritability::Inheritable);
            // Pass the client process a handle to the server.
            clientProcess->StartInfo->Arguments = pipeServer->GetClientHandleAsString();
            clientProcess->StartInfo->UseShellExecute = false;
            Console::WriteLine("[SERVER] Starting client process...");
            clientProcess->Start();

            pipeServer->DisposeLocalCopyOfClientHandle();

            try
            {
                if (WaitForClientSign(pipeServer))
                {
                    Console::WriteLine("[SERVER] Valid sign code received!");
                }
                else
                {
                    Console::WriteLine("[SERVER] Invalid sign code received!");
                }
            }
            catch (IOException^ e)
            {
                 Console::WriteLine("[SERVER] Error: {0}", e->Message);
            }
            clientProcess->WaitForExit();
            clientProcess->Close();
            Console::WriteLine("[SERVER] Client quit. Server terminating.");
        }
        else
        {
            PipeStream^ pipeClient =
                gcnew AnonymousPipeClientStream(PipeDirection::Out, args[1]);
            try
            {
                Console::WriteLine("[CLIENT] Sending sign code...");
                SendClientSign(pipeClient);
            }
            catch (IOException^ e)
            {
                Console::WriteLine("[CLIENT] Error: {0}", e->Message);
            }
            Console::WriteLine("[CLIENT] Terminating.");
        }
    }

private:
    static bool WaitForClientSign(PipeStream^ inStream)
    {
        array<Byte>^ inSign = gcnew array<Byte>(matchSign->Length);
        int len = inStream->Read(inSign, 0, matchSign->Length);
        bool valid = len == matchSign->Length;

        while (valid && len-- > 0)
        {
            valid = valid && (matchSign[len] == inSign[len]);
        }
        return valid;
    }

    static void SendClientSign(PipeStream^ outStream)
    {
        outStream->Write(matchSign, 0, matchSign->Length);
    }
};

int main()
{
    PipeStreamExample::Main();
}
using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;

class PipeStreamExample
{
    private static byte[] matchSign = {9, 0, 9, 0};

    public static void Main()
    {
        string[] args = Environment.GetCommandLineArgs();
        if (args.Length < 2)
        {
            Process clientProcess = new Process();

            clientProcess.StartInfo.FileName = Environment.CommandLine;

            using (AnonymousPipeServerStream pipeServer =
                new AnonymousPipeServerStream(PipeDirection.In,
                HandleInheritability.Inheritable))
            {
                // Pass the client process a handle to the server.
                clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
                clientProcess.StartInfo.UseShellExecute = false;
                Console.WriteLine("[SERVER] Starting client process...");
                clientProcess.Start();

                pipeServer.DisposeLocalCopyOfClientHandle();

                try
                {
                    if (WaitForClientSign(pipeServer))
                    {
                        Console.WriteLine("[SERVER] Valid sign code received!");
                    }
                    else
                    {
                        Console.WriteLine("[SERVER] Invalid sign code received!");
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine("[SERVER] Error: {0}", e.Message);
                }
            }
            clientProcess.WaitForExit();
            clientProcess.Close();
            Console.WriteLine("[SERVER] Client quit. Server terminating.");
        }
        else
        {
            using (PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.Out, args[1]))
            {
                try
                {
                    Console.WriteLine("[CLIENT] Sending sign code...");
                    SendClientSign(pipeClient);
                }
                catch (IOException e)
                {
                     Console.WriteLine("[CLIENT] Error: {0}", e.Message);
                }
            }
            Console.WriteLine("[CLIENT] Terminating.");
        }
    }

    private static bool WaitForClientSign(PipeStream inStream)
    {
        byte[] inSign = new byte[matchSign.Length];
        int len = inStream.Read(inSign, 0, matchSign.Length);
        bool valid = len == matchSign.Length;

        while (valid && len-- > 0)
        {
            valid = valid && (matchSign[len] == inSign[len]);
        }
        return valid;
    }

    private static void SendClientSign(PipeStream outStream)
    {
        outStream.Write(matchSign, 0, matchSign.Length);
    }
}
Imports System.IO
Imports System.IO.Pipes
Imports System.Diagnostics

Class PipeStreamExample
    Private Shared matchSign() As Byte = {9, 0, 9, 0}

    Public Shared Sub Main()
        Dim args() As String = Environment.GetCommandLineArgs()
        If args.Length < 2 Then
            Dim clientProcess As New Process()

            clientProcess.StartInfo.FileName = Environment.CommandLine

            Using pipeServer As New AnonymousPipeServerStream( _
                PipeDirection.In, HandleInheritability.Inheritable)

                ' Pass the client process a handle to the server.
                clientProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString()
                clientProcess.StartInfo.UseShellExecute = false
                Console.WriteLine("[SERVER] Starting client process...")
                clientProcess.Start()

                pipeServer.DisposeLocalCopyOfClientHandle()

                Try
                    If WaitForClientSign(pipeServer) Then
                        Console.WriteLine("[SERVER] Valid sign code received!")
                    Else
                        Console.WriteLine("[SERVER] Invalid sign code received!")
                    End If
                Catch e As IOException
                    Console.WriteLine("[SERVER] Error: {0}", e.Message)
                End Try
            End Using
            clientProcess.WaitForExit()
            clientProcess.Close()
            Console.WriteLine("[SERVER] Client quit. Server terminating.")
        Else
            Using pipeClient As PipeStream = New AnonymousPipeClientStream(PipeDirection.Out, args(1))
                Try
                    Console.WriteLine("[CLIENT] Sending sign code...")
                    SendClientSign(pipeClient)
                Catch e As IOException
                    Console.WriteLine("[CLIENT] Error: {0}", e.Message)
                End Try
            End Using
            Console.WriteLine("[CLIENT] Terminating.")
        End If
    End Sub

    Private Shared Function WaitForClientSign(inStream As PipeStream) As Boolean
        Dim inSign() As Byte = Array.CreateInstance(GetType(Byte), matchSign.Length)
        Dim len As Integer = inStream.Read(inSign, 0, matchSign.Length)
        Dim valid = len.Equals(matchSign.Length)

        While len > 0
            len -= 1
            valid = valid And (matchSign(len).Equals(inSign(len)))
        End While
        Return valid
    End Function

    Private Shared Sub SendClientSign(outStream As PipeStream)
        outStream.Write(matchSign, 0, matchSign.Length)
    End Sub
End Class

注釈

プロパティを使用して、 CanRead 現在 PipeStream のオブジェクトが読み取り操作をサポートしているかどうかを判断します。

メソッドを Read 呼び出すと、バイトが読み取られるか、ストリームの末尾に達するまで count ブロックされます。 非同期読み取り操作については、 と EndReadを参照してくださいBeginRead

適用対象