Language

PipeStream.Read メソッド

定義

オーバーロード

名前 説明
Read(Span<Byte>)

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

Read(Byte[], Int32, Int32)

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

Read(Span<Byte>)

ソース:
PipeStream.Unix.cs
ソース:
PipeStream.Unix.cs
ソース:
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
ソース:
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 になります。

属性

例外

buffer は nullです。

offset が 0 未満です。

-又は-

count が 0 未満です。

count が、 bufferで使用可能なバイト数を超えています。

パイプが閉じている。

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

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

I/O エラーが発生しました。

例

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

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バイトが読み取られるか、ストリームの末尾に達するまでブロックします。 非同期読み取り操作については、 BeginRead と EndReadに関する記事を参照してください。

適用対象