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. Текущая позиция в потоке удобочитается на количество прочитанных байтов; Однако при возникновении исключения текущая позиция в потоке остается неизменной.

Этот метод будет блокироваться до тех пор, пока не будет прочитан хотя бы один байт данных, если данные не будут доступны.

Этот метод возвращает значение 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. Это число может быть меньше количества запрошенных байтов, если это количество байтов в настоящее время недоступно, а также равняться нулю, если достигнут конец потока.

Атрибуты

Исключения

buffer имеет значение null.

Значение параметраoffset меньше 0.

-или-

Значение параметраcount меньше 0.

count больше, чем число байтов, доступных в buffer.

Канал закрыт.

Этот канал не поддерживает операции чтения.

Канал отключен, ожидает подключения, или дескриптор не был задан.

Ошибка ввода/вывода.

Примеры

В следующем примере создается анонимный клиент канала и сервер канала. Сервер конвейера 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 будут прочитаны байты или не будет достигнут конец потока. Сведения об асинхронных операциях чтения см. в разделах BeginRead и EndRead.

Применяется к