PipeStream.Read Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Überlädt
| Name | Beschreibung |
|---|---|
| Read(Span<Byte>) |
Liest eine Abfolge von Bytes aus dem aktuellen Datenstrom, schreibt sie in ein Bytearray und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes. |
| Read(Byte[], Int32, Int32) |
Liest einen Byteblock aus einem Datenstrom und schreibt die Daten an einen angegebenen Puffer, beginnend an einer angegebenen Position für eine angegebene Länge. |
Read(Span<Byte>)
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
Liest eine Abfolge von Bytes aus dem aktuellen Datenstrom, schreibt sie in ein Bytearray und wechselt die Position innerhalb des Datenstroms um die Anzahl der gelesenen Bytes.
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
Parameter
Ein Speicherbereich. Wenn diese Methode zurückgegeben wird, werden die Inhalte dieses Bereichs durch die aus der aktuellen Quelle gelesenen Bytes ersetzt.
Gibt zurück
Die Gesamtanzahl der Bytes, die in die buffer. Dies kann kleiner als die Anzahl der Bytes sein, die zugewiesen buffer werden, wenn viele Bytes derzeit nicht verfügbar sind, oder Null (0), wenn das Ende des Datenstroms erreicht wurde.
Ausnahmen
Die Anzahl der gelesenen Bytes war länger als die Pufferlänge.
Der Datenstrom unterstützt das Lesen nicht.
Es kann nicht auf eine geschlossene Pfeife zugegriffen werden.
Das Rohr wurde noch nicht verbunden.
- oder -
Das Rohr befindet sich in einem getrennten Zustand.
- oder -
Der Rohrziehpunkt wurde nicht festgelegt. (Haben Sie Ihren PipeStream Implementierungsaufruf aufgerufen InitializeHandle(SafePipeHandle, Boolean, Boolean)?
Hinweise
Verwenden Sie die CanRead Eigenschaft, um zu bestimmen, ob das aktuelle PipeStream Objekt Lesevorgänge unterstützt.
Verwenden Sie die ReadAsync Methode, um asynchron aus dem aktuellen Datenstrom zu lesen.
Diese Methode liest maximal buffer.Length Bytes aus dem aktuellen Datenstrom und speichert sie in buffer. Die aktuelle Position innerhalb des Datenstroms wird um die Anzahl der gelesenen Bytes erweitert; Wenn jedoch eine Ausnahme auftritt, bleibt die aktuelle Position innerhalb des Datenstroms unverändert.
Diese Methode wird blockiert, bis mindestens ein Byte von Daten gelesen werden kann, falls keine Daten verfügbar sind.
Diese Methode gibt 0 nur zurück, wenn im Datenstrom keine weiteren Daten vorhanden sind und keine weiteren Daten erwartet werden (z. B. ein geschlossener Socket oder ein Ende der Datei).
Diese Methode kann weniger Bytes zurückgeben als angefordert, auch wenn das Ende des Datenstroms nicht erreicht wurde.
Wird zum Lesen primitiver Datentypen verwendet BinaryReader .
Gilt für:
Read(Byte[], Int32, Int32)
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
- Quelle:
- PipeStream.Unix.cs
Liest einen Byteblock aus einem Datenstrom und schreibt die Daten an einen angegebenen Puffer, beginnend an einer angegebenen Position für eine angegebene Länge.
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
Parameter
- buffer
- Byte[]
Wenn diese Methode zurückgegeben wird, enthält das angegebene Bytearray mit den Werten zwischen offset und (offset + count - 1), die durch die aus der aktuellen Quelle gelesenen Bytes ersetzt werden.
- offset
- Int32
Der Byteoffset im buffer Array, an dem die gelesenen Bytes platziert werden.
- count
- Int32
Die maximale Anzahl der zu lesenden Bytes.
Gibt zurück
Die Gesamtanzahl der Bytes, in die gelesen bufferwird. Dies kann kleiner als die Anzahl der angeforderten Bytes sein, wenn diese Anzahl von Bytes derzeit nicht verfügbar ist, oder 0, wenn das Ende des Datenstroms erreicht ist.
- Attribute
Ausnahmen
buffer ist null.
count ist größer als die Anzahl der in buffer.
Das Rohr ist geschlossen.
Die Pipe unterstützt keine Lesevorgänge.
Die Leitung ist getrennt, wartet auf die Verbindung, oder der Ziehpunkt wurde nicht festgelegt.
Ein E/A-Fehler ist aufgetreten.
Beispiele
Im folgenden Beispiel wird ein anonymer Pipeclient und ein Pipeserver erstellt. Der Pipeserver verwendet die Read Methode, um eine Reihe von Bytes vom Pipeclient als Überprüfungscode zu lesen. Sowohl der Pipeclient als auch der Pipeserver sind Teil desselben Beispiels. Der Serverteil des Beispiels erstellt einen Clientprozess und übergibt ihn als Argument an ein anonymes Pipehandle.
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
Hinweise
Verwenden Sie die CanRead Eigenschaft, um zu bestimmen, ob das aktuelle PipeStream Objekt Lesevorgänge unterstützt.
Das Aufrufen der Read Methodenblöcke, bis count Bytes gelesen werden oder das Ende des Datenstroms erreicht ist. Informationen zu asynchronen Lesevorgängen finden Sie unter BeginRead und EndRead.