PipeStream.Read Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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.
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.