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
. Это число может быть меньше количества выделенных в 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.