GZipStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Метод

Определение

Начинает операцию асинхронного чтения.Begins an asynchronous read operation. (Вместо него рекомендуется использовать метод ReadAsync(Byte[], Int32, Int32).)(Consider using the ReadAsync(Byte[], Int32, Int32) method instead.)

public:
 override IAsyncResult ^ BeginRead(cli::array <System::Byte> ^ array, int offset, int count, AsyncCallback ^ asyncCallback, System::Object ^ asyncState);
public:
 override IAsyncResult ^ BeginRead(cli::array <System::Byte> ^ buffer, int offset, int count, AsyncCallback ^ cback, System::Object ^ state);
public override IAsyncResult BeginRead (byte[] array, int offset, int count, AsyncCallback? asyncCallback, object? asyncState);
public override IAsyncResult BeginRead (byte[] array, int offset, int count, AsyncCallback asyncCallback, object asyncState);
public override IAsyncResult BeginRead (byte[] buffer, int offset, int count, AsyncCallback cback, object state);
override this.BeginRead : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
override this.BeginRead : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginRead (array As Byte(), offset As Integer, count As Integer, asyncCallback As AsyncCallback, asyncState As Object) As IAsyncResult
Public Overrides Function BeginRead (buffer As Byte(), offset As Integer, count As Integer, cback As AsyncCallback, state As Object) As IAsyncResult

Параметры

arraybuffer
Byte[]

Массив байтов, в который следует считывать данные.The byte array to read the data into.

offset
Int32

Смещение байтов в array, с которого начинается чтение данных из потока.The byte offset in array at which to begin reading data from the stream.

count
Int32

Максимальное число байтов, предназначенных для чтения.The maximum number of bytes to read.

asyncCallbackcback
AsyncCallback

Дополнительный асинхронный ответный вызов по завершении операции чтения.An optional asynchronous callback, to be called when the read operation is complete.

asyncStatestate
Object

Предоставляемый пользователем объект, являющийся отличительным признаком данного конкретного запроса на асинхронное чтение от других запросов.A user-provided object that distinguishes this particular asynchronous read request from other requests.

Возвращаемое значение

IAsyncResult

Объект, представляющий асинхронную операцию чтения, которая может все еще быть отложена.An object that represents the asynchronous read operation, which could still be pending.

Исключения

Метод пытался в асинхронном режиме выполнить чтение за пределами потока, или произошла ошибка диска.The method tried to read asynchronously past the end of the stream, or a disk error occurred.

Один или несколько аргументов являются недопустимыми.One or more of the arguments is invalid.

Методы были вызваны после закрытия потока.Methods were called after the stream was closed.

Текущая реализация класса GZipStream не поддерживает операцию чтения.The current GZipStream implementation does not support the read operation.

Операция чтения не может быть выполнена, поскольку поток закрыт.A read operation cannot be performed because the stream is closed.

Примеры

В следующем примере кода показано, как использовать GZipStream класс для сжатия и распаковки файла.The following code example shows how to use the GZipStream class to compress and decompress a file.

using System;
using System.IO;
using System.IO.Compression;

public class Program
{
    private static string directoryPath = @".\temp";
    public static void Main()
    {
        DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);
        Compress(directorySelected);

        foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))
        {
            Decompress(fileToDecompress);
        }
    }

    public static void Compress(DirectoryInfo directorySelected)
    {
        foreach (FileInfo fileToCompress in directorySelected.GetFiles())
        {
            using (FileStream originalFileStream = fileToCompress.OpenRead())
            {
                if ((File.GetAttributes(fileToCompress.FullName) &
                   FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
                {
                    using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))
                    {
                        using (GZipStream compressionStream = new GZipStream(compressedFileStream,
                           CompressionMode.Compress))
                        {
                            originalFileStream.CopyTo(compressionStream);
                        }
                    }
                    FileInfo info = new FileInfo(directoryPath + Path.DirectorySeparatorChar + fileToCompress.Name + ".gz");
                    Console.WriteLine($"Compressed {fileToCompress.Name} from {fileToCompress.Length.ToString()} to {info.Length.ToString()} bytes.");
                }
            }
        }
    }

    public static void Decompress(FileInfo fileToDecompress)
    {
        using (FileStream originalFileStream = fileToDecompress.OpenRead())
        {
            string currentFileName = fileToDecompress.FullName;
            string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

            using (FileStream decompressedFileStream = File.Create(newFileName))
            {
                using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                {
                    decompressionStream.CopyTo(decompressedFileStream);
                    Console.WriteLine($"Decompressed: {fileToDecompress.Name}");
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Private directoryPath As String = ".\temp"
    Public Sub Main()
        Dim directorySelected As New DirectoryInfo(directoryPath)
        Compress(directorySelected)

        For Each fileToDecompress As FileInfo In directorySelected.GetFiles("*.gz")
            Decompress(fileToDecompress)
        Next
    End Sub

    Public Sub Compress(directorySelected As DirectoryInfo)
        For Each fileToCompress As FileInfo In directorySelected.GetFiles()
            Using originalFileStream As FileStream = fileToCompress.OpenRead()
                If (File.GetAttributes(fileToCompress.FullName) And FileAttributes.Hidden) <> FileAttributes.Hidden And fileToCompress.Extension <> ".gz" Then
                    Using compressedFileStream As FileStream = File.Create(fileToCompress.FullName & ".gz")
                        Using compressionStream As New GZipStream(compressedFileStream, CompressionMode.Compress)

                            originalFileStream.CopyTo(compressionStream)
                        End Using
                    End Using
                    Dim info As New FileInfo(directoryPath & Path.DirectorySeparatorChar & fileToCompress.Name & ".gz")
                    Console.WriteLine($"Compressed {fileToCompress.Name} from {fileToCompress.Length.ToString()} to {info.Length.ToString()} bytes.")

                End If
            End Using
        Next
    End Sub


    Private Sub Decompress(ByVal fileToDecompress As FileInfo)
        Using originalFileStream As FileStream = fileToDecompress.OpenRead()
            Dim currentFileName As String = fileToDecompress.FullName
            Dim newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length)

            Using decompressedFileStream As FileStream = File.Create(newFileName)
                Using decompressionStream As GZipStream = New GZipStream(originalFileStream, CompressionMode.Decompress)
                    decompressionStream.CopyTo(decompressedFileStream)
                    Console.WriteLine($"Decompressed: {fileToDecompress.Name}")
                End Using
            End Using
        End Using
    End Sub
End Module

Комментарии

Начиная с .NET Framework 4,5.NET Framework 4.5 , асинхронные операции чтения можно выполнять с помощью Stream.ReadAsync метода.Starting with the .NET Framework 4,5.NET Framework 4.5, you can perform asynchronous read operations by using the Stream.ReadAsync method. BeginReadМетод по-прежнему доступен в .NET Framework 4,5.NET Framework 4.5 для поддержки устаревшего кода. Однако асинхронные операции ввода-вывода можно легко реализовать с помощью новых асинхронных методов.The BeginRead method is still available in .NET Framework 4,5.NET Framework 4.5 to support legacy code; however, you can implement asynchronous I/O operations more easily by using the new async methods. Дополнительные сведения см. в разделе Асинхронный файловый ввод-вывод.For more information, see Asynchronous File I/O.

Передайте IAsyncResult возвращаемое значение EndRead методу потока, чтобы определить количество считанных байтов и освободить ресурсы операционной системы, используемые для чтения.Pass the IAsyncResult return value to the EndRead method of the stream to determine how many bytes were read and to release operating system resources used for reading. Это можно сделать с помощью того же кода, который вызвал BeginRead или в обратном вызове, переданном в BeginRead .You can do this either by using the same code that called BeginRead or in a callback passed to BeginRead.

Текущая позицией в потоке обновляется при выдаче асинхронного чтения или записи, а не по завершении операции ввода-вывода.The current position in the stream is updated when the asynchronous read or write is issued, not when the I/O operation completes.

Несколько одновременных асинхронных запросов отрабатывают порядок выполнения запроса неопределенным образом.Multiple simultaneous asynchronous requests render the request completion order uncertain.

Используйте CanRead свойство, чтобы определить, поддерживает ли текущий GZipStream объект чтение.Use the CanRead property to determine whether the current GZipStream object supports reading.

Если поток закрыт или передан недопустимый аргумент, исключения немедленно создаются из BeginRead .If a stream is closed or you pass an invalid argument, exceptions are thrown immediately from BeginRead. Ошибки, возникающие во время асинхронного запроса чтения, такие как сбой диска во время запроса ввода-вывода, происходят в потоке пула потоков и вызывают исключения при вызове метода EndRead .Errors that occur during an asynchronous read request, such as a disk failure during the I/O request, occur on the thread pool thread and throw exceptions when calling EndRead.

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