PipeStream.Read Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Överlagringar
| Name | Description |
|---|---|
| Read(Span<Byte>) |
Läser en sekvens med byte från den aktuella strömmen, skriver dem till en bytematris och avancerar positionen i dataströmmen med antalet lästa byte. |
| Read(Byte[], Int32, Int32) |
Läser ett block med byte från en dataström och skriver data till en angiven buffert som börjar på en angiven position för en angiven längd. |
Read(Span<Byte>)
Läser en sekvens med byte från den aktuella strömmen, skriver dem till en bytematris och avancerar positionen i dataströmmen med antalet lästa byte.
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
Parametrar
En region med minne. När den här metoden returnerar ersätts innehållet i den här regionen med byteen som lästs från den aktuella källan.
Returer
Det totala antalet byte som lästs in i buffer. Detta kan vara mindre än antalet byte som allokerats i buffer om så många byte inte är tillgängliga för närvarande, eller noll (0) om strömmens slut har nåtts.
Undantag
Antalet byte som lästes var längre än buffertlängden.
Strömmen stöder inte läsning.
Det går inte att komma åt ett stängt rör.
Röret har inte anslutits än.
-eller-
Röret är i frånkopplat tillstånd.
-eller-
Rörhandtaget har inte ställts in. (Anropade implementeringen PipeStreamInitializeHandle(SafePipeHandle, Boolean, Boolean)?
Kommentarer
Använd egenskapen CanRead för att avgöra om det aktuella PipeStream objektet stöder läsåtgärder.
ReadAsync Använd metoden för att läsa asynkront från den aktuella strömmen.
Den här metoden läser maximalt antal buffer.Length byte från den aktuella strömmen och lagrar dem i buffer. Den aktuella positionen i dataströmmen avanceras av antalet lästa byte. Men om ett undantag inträffar förblir den aktuella positionen i dataströmmen oförändrad.
Den här metoden blockeras tills minst en byte data kan läsas, i händelse av att inga data är tillgängliga.
Den här metoden returnerar endast 0 när det inte finns fler data i dataströmmen och inget mer förväntas (till exempel en sluten socket eller filslut).
Den här metoden kan returnera färre byte än vad som begärts även om strömmens slut inte har nåtts.
Används BinaryReader för att läsa primitiva datatyper.
Gäller för
Read(Byte[], Int32, Int32)
Läser ett block med byte från en dataström och skriver data till en angiven buffert som börjar på en angiven position för en angiven längd.
public:
override int Read(cli::array <System::Byte> ^ buffer, int offset, int count);
[System.Security.SecurityCritical]
public override int Read(byte[] buffer, int offset, int count);
public override int Read(byte[] buffer, int offset, int count);
[<System.Security.SecurityCritical>]
override this.Read : byte[] * int * int -> int
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
Parametrar
- buffer
- Byte[]
När den här metoden returnerar innehåller den angivna bytematrisen med värdena mellan offset och (offset + count - 1) ersatta av byteen som lästs från den aktuella källan.
- offset
- Int32
Byteförskjutningen i matrisen buffer där byte som läss placeras.
- count
- Int32
Det maximala antalet byte som ska läsas.
Returer
Det totala antalet byte som läse in i buffer. Detta kan vara mindre än antalet byte som begärs om det antalet byte inte är tillgängligt för närvarande, eller 0 om strömmens slut nås.
- Attribut
Undantag
buffer är null.
count är större än antalet tillgängliga byte i buffer.
Röret är stängt.
Röret stöder inte läsåtgärder.
Röret är frånkopplat, väntar på att ansluta, eller så har handtaget inte ställts in.
Ett I/O-fel uppstod.
Exempel
I följande exempel skapas en anonym pipe-klient och pipe-server. Pipe-servern använder Read metoden för att läsa en serie byte från pipe-klienten som en valideringskod. Både pipe-klienten och pipe-servern ingår i samma exempel. Serverdelen i exemplet skapar en klientprocess och skickar den ett anonymt rörhandtag som argument.
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
Kommentarer
Använd egenskapen CanRead för att avgöra om det aktuella PipeStream objektet stöder läsåtgärder.
Read Anropa metoden block tills count byte läse eller slutet av strömmen har nåtts. Asynkrona läsåtgärder finns i BeginRead och EndRead.