@Smiz001
C#-developer

Почему не обрабатывается файл блоками?

Написал 2 метода для архивации и шифрования файла.
1й рабочий:
public static void CompressAndEncrypt(string sourceFile, string encrFile)
		{
			int bufferSize = 5242880;
			using (var readStream = new FileStream(sourceFile, FileMode.Open, FileAccess.ReadWrite))
			{
				using (var writeStream = new FileStream(encrFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
				{
					DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
					cryptic.Key = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
					cryptic.IV = ASCIIEncoding.ASCII.GetBytes("ABCDEFGH");
					using (var crypto = new CryptoStream(writeStream, cryptic.CreateEncryptor(), CryptoStreamMode.Write))
					{
						using (var zip = new GZipStream(crypto, CompressionMode.Compress))
						{
							int bytesRead = -1;
							byte[] bytes = new byte[bufferSize];

							while ((bytesRead = readStream.Read(bytes, 0, bufferSize)) > 0)
							{
								zip.Write(bytes, 0, bytesRead);
							}
						}
					}
				}
			}
		}

2й нерабочий:
public static void CompressAndEncryptBlock(string sourceFile, string outputFile)
		{
			int bufferSize = 5242880;
			int bytesRead;
			var bytes = new byte[bufferSize];

			using (var readStream = new FileStream(sourceFile, FileMode.Open, FileAccess.ReadWrite))
			{
				using (var writer = new FileStream(outputFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
				{
					while ((bytesRead = readStream.Read(bytes, 0, bufferSize)) > 0)
					{
						using (var writeStream = new MemoryStream())
						{
							DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
							cryptic.Key = Encoding.ASCII.GetBytes("ABCDEFGH");
							cryptic.IV = Encoding.ASCII.GetBytes("ABCDEFGH");
							using (var crypto = new CryptoStream(writeStream, cryptic.CreateEncryptor(), CryptoStreamMode.Write))
							{
								using (var zip = new GZipStream(crypto, CompressionMode.Compress, true))
								{
									zip.Write(bytes, 0, bytesRead);
									//После этого Capacity у writeStream(MemoryStream) почему-то больше чем его Length
								}
								var bytes1 = new byte[writeStream.Length];
								writeStream.Read(bytes1, 0, bytes1.Length);
								writer.Write(bytes1, 0, bytes1.Length);
							}
						}
					}
				}
			}
		}

Почему вторым способом обработка файла идет некорректно?
Второй способ мне в будущем нужен будет для передачи файла блоками (сейчас пока его просто тестирую для записи на диск).
Если я использую второй метод то файл на выходе получается чуть меньше, чем при использование первого метода.
И при попытке расшифровать и разархивировать файл, полученный вторым методом, у меня вылетает исключение

System.IO.InvalidDataException occurred
HResult=0x80131501
Message=Неправильное магическое число в заголовке GZip. Передача должна идти в поток GZip.
Source=System
StackTrace:
at System.IO.Compression.GZipDecoder.ReadHeader(InputBuffer input)
at System.IO.Compression.Inflater.Decode()
at System.IO.Compression.Inflater.Inflate(Byte[] bytes, Int32 offset, Int32 length)
at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.Compression.GZipStream.Read(Byte[] array, Int32 offset, Int32 count)
  • Вопрос задан
  • 355 просмотров
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Возможно, вместо
var bytes1 = new byte[writeStream.Length];
writeStream.Read(bytes1, 0, bytes1.Length);
writer.Write(bytes1, 0, bytes1.Length);

следует написать что-то типа
writeStream.Position = 0;
writeStream.CopyTo(writer);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы