Idioma

PipeStream.Read Método

Definição

Sobrecargas

Name Descrição
Read(Span<Byte>)

Lê uma sequência de bytes do fluxo atual, escreve-os num array de bytes e avança a posição dentro do fluxo pelo número de bytes lidos.

Read(Byte[], Int32, Int32)

Lê um bloco de bytes de um fluxo e escreve os dados num buffer especificado a partir de uma posição determinada para um comprimento especificado.

Read(Span<Byte>)

Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs

Lê uma sequência de bytes do fluxo atual, escreve-os num array de bytes e avança a posição dentro do fluxo pelo número de bytes lidos.

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

Parâmetros

buffer
Span<Byte>

Uma região da memória. Quando este método retorna, o conteúdo desta região é substituído pelos bytes lidos da fonte atual.

Devoluções

O número total de bytes lidos no buffer. Isto pode ser inferior ao número de bytes alocados buffer se esse número de bytes não estiver disponível atualmente, ou zero (0) se o fim do fluxo for atingido.

Exceções

O número de bytes lidos era maior do que o comprimento do buffer.

O stream não suporta leitura.

Não é possível aceder a um tubo fechado.

O cano ainda não foi ligado.

-ou-

O tubo está desligado.

-ou-

A maçaneta do tubo ainda não foi ajustada. (A sua PipeStream implementação pediu InitializeHandle(SafePipeHandle, Boolean, Boolean)?

Observações

Use a CanRead propriedade para determinar se o objeto atual PipeStream suporta operações de leitura.

Use o ReadAsync método para ler assíncronamente a partir do fluxo atual.

Este método lê um máximo de buffer.Length bytes do fluxo atual e armazena-os em buffer. A posição atual dentro do fluxo é avançada pelo número de bytes lidos; no entanto, se ocorrer uma exceção, a posição atual dentro do fluxo mantém-se inalterada.

Este método bloqueia até que pelo menos um byte de dados possa ser lido, caso não haja dados disponíveis.

Este método retorna 0 apenas quando não há mais dados no fluxo e não se espera mais (como um socket fechado ou fim de ficheiro).

Este método pode devolver menos bytes do que o solicitado, mesmo que o fim do fluxo não tenha sido atingido.

Usar BinaryReader para ler tipos de dados primitivos.

Aplica-se a

Read(Byte[], Int32, Int32)

Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs
Origem:
PipeStream.Unix.cs

Lê um bloco de bytes de um fluxo e escreve os dados num buffer especificado a partir de uma posição determinada para um comprimento especificado.

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

Parâmetros

buffer
Byte[]

Quando este método retorna, contém o array de bytes especificado com os valores entre offset e (offset + count - 1) substituídos pelos bytes lidos da fonte atual.

offset
Int32

O deslocamento de bytes no buffer array onde serão colocados os bytes que são lidos.

count
Int32

O número máximo de bytes a ler.

Devoluções

O número total de bytes que são lidos em buffer. Isto pode ser inferior ao número de bytes solicitados se esse número de bytes não estiver disponível no momento, ou 0 se o fim do fluxo for atingido.

Atributos

Exceções

buffer é null.

offset é inferior a 0.

-ou-

count é inferior a 0.

count é maior do que o número de bytes disponíveis em buffer.

O tubo está fechado.

O tubo não suporta operações de leitura.

O tubo está desligado, à espera de ser ligado, ou a maçaneta não foi ajustada.

Ocorreu qualquer erro de I/O.

Exemplos

O exemplo seguinte cria um cliente e servidor de pipe anónimos. O servidor de tubos utiliza o Read método para ler uma série de bytes do cliente de tubos como código de validação. Tanto o cliente de pipe como o servidor de pipe fazem parte do mesmo exemplo. A parte servidor do exemplo cria um processo cliente e passa-lhe um handle anónimo como argumento.

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

Observações

Use a CanRead propriedade para determinar se o objeto atual PipeStream suporta operações de leitura.

Chamar os Read blocos de método até count que bytes sejam lidos ou até que o fim do fluxo seja alcançado. Para operações de leitura assíncronas, veja BeginRead e EndRead.

Aplica-se a