可以返回CryptoStream并且仍然可以正确处理所有内容吗?
如果我有一个我想传递给用户的CryptoStream
,那么天真的方法就是
public Stream GetDecryptedFileStream(string inputFile, byte[] key, byte[] iv) { var fsCrypt = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read); var rmCrypto = new RijndaelManaged(); var transform = rmCrypto.CreateDecryptor(key, iv); var cs = new CryptoStream(fsCrypt, transform, CryptoStreamMode.Read); return cs; }
我知道当我处理CryptoStream
,底层的FileStream
也将被处理掉 。 我正在运行的问题是我如何处理rmCrypto
和transform
? RijndaelManaged
和ICryptoTransform
是一次性类,但处理流不会处理这两个对象。
处理这种情况的正确方法是什么?
我会考虑创建自己的包装流的类,然后你可以管理它们的处理。 沿着这些方向的事情(对不起 – 不知道我头顶的变换对象的类型)。
public CryptoStreamWrapper : Stream, IDisposable { public CryptoStreamWrapper(CryptoStream stream, RijndaelManaged rmCrypto, IDisposable transform) { this.transform = transform; this.rmCrypto = rmCrypto; this.stream = stream; } public void Dispose() { this.transform.Dispose(); this.rmCrypto.Dispose(); this.stream.Dispose(); } }
Ian打败了我的基本概念( 向上投票 ),但CryptoStream本身并没有密封,所以创建一个包含需要处理的东西的派生类是微不足道的。
/// /// Creates a class that creates a and wraps the disposing action of all the associated objects /// class ReturnableCryptoStream : CryptoStream { private readonly ICryptoTransform _transform; private readonly IDisposable _algorithm; public ReturnableCryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode) : this(stream, transform, mode, null) { } public ReturnableCryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode, IDisposable algorithm) : base(stream, transform, mode) { _transform = transform; _algorithm = algorithm; } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { if (_transform != null) _transform.Dispose(); if (_algorithm != null) _algorithm.Dispose(); } } }
用过像
public Stream GetDecryptedFileStream(string inputFile, byte[] key, byte[] iv) { var fsCrypt = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read); var rmCrypto = new RijndaelManaged(); var transform = rmCrypto.CreateDecryptor(key, iv); var cs = new ReturnableCryptoStream(fsCrypt, transform, CryptoStreamMode.Read, rmCrypto); return cs; }