Я создаю утилиту шифрования/дешифрования файлов с использованием .NET Framework 4.5, но когда я закончу использовать CrypyoStream для записи в целевой поток, который запишет файл на диск или будет служить потоком памяти для непосредственного чтения зашифрованный файл, поток назначения закрыт
Sub Crypt(ByRef destinationStream As System.IO.Stream) Implements IVersion.Crypt
InitMetadataFromCryptStream()
destinationStream.Write(_fileMetadata.GetBytes(), 0, _fileMetadata.Size)
Using cryptStream As New CryptoStream(destinationStream, encAlgo.CreateEncryptor(), CryptoStreamMode.Write)
_fileStream.CopyTo(cryptStream)
cryptStream.FlushFinalBlock()
End Using
End Sub
InitMetadataFromCryptStream по сути подготавливает пользовательский заголовок для файла, а encAlgo является экземпляром Rijndael.
Я нашел рабочее решение: скопировать файл на новый MemoryStream и использовать его для инициализации CryptoStream, но это кажется большой тратой памяти и, вероятно, не лучшим вариантом.
@PresidentJamesK.Polk Вы забыли указать значение leaveOpen ;)
Иван, большинство реализаций потоков по умолчанию закрывают все базовые потоки.
@PresidentJamesK.Polk Я не могу использовать этот конструктор, потому что сейчас я работаю с приложением .NET Framework 4.5, и доступен только один конструктор без параметра leaveOpenLearn.microsoft.com/it-it/dotnet/api/…
Собственно, должно быть понятно, что если вы используете такую старую версию, вам следует упомянуть об этом в вопросе с самого начала! Ведь поддержка .NET Framework 4.5 была прекращена в январе 2016 года (даже 4.5.2 была прекращена в апреле 2022 года), здесь.
Возможно, вам это интересно: Может ли CryptoStream оставить базовый поток открытым?
@Топако Вот и все! Удаление только неуправляемых ресурсов с помощью нового класса помогло.





Как предложил @Topaco, самый быстрый способ реализовать логику параметра LeaveOpen, представленную в .NET Framework 4.7.2, — это создать новый класс, который наследует класс CrypoStream и удаляет только неуправляемые ресурсы.
исх. ответ: https://stackoverflow.com/a/28057998/6419298
Может быть, вы могли бы использовать другой конструктор
CryptoStream?public CryptoStream (System.IO.Stream stream, System.Security.Cryptography.ICryptoTransform transform, System.Security.Cryptography.CryptoStreamMode mode, bool leaveOpen);