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.
Возвращаемое значение
Объект, представляющий асинхронную операцию чтения, которая может все еще быть отложена.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.