PipeStream.Read Metod

Definition

Ö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

buffer
Span<Byte>

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.

offset är mindre än 0.

-eller-

count är mindre än 0.

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.

Gäller för