【问题标题】:Does disposing a CryptoStream flush the final block?处理 CryptoStream 是否会刷新最后一个块?
【发布时间】:2021-09-13 01:17:27
【问题描述】:

可以从 Microsoft .NET API 中提取以下信息:

  • using会调用IDisposable.Dispose()的实现;
  • IDisposable.Dispose() 应该在任何 Stream 实例上调用 Flush()
  • CryptoStream.Close() 将调用CryptoStream.FlushFinalBlock()

但是,这似乎在规范中留下了一个空白:处理 CryptoStream 实例是否也会调用 CryptoStream.FlushFinalBlock(),如果是这样,这在哪里记录?

【问题讨论】:

    标签: .net encryption stream using cryptostream


    【解决方案1】:

    Dispose() 调用 FlushFinalBlock() 如果它还没有被调用。这也在文档中,但不是集中式的,而是分布式的:

    CryptoStreams 不会重载Close() 或(无参数)公共Dispose(),因此会调用Stream 类的实现。

    Stream#Dispose() (s. Remarks) 的文档指出:

    此方法通过将任何更改写入后备存储并关闭流以释放资源来释放流。

    这与源代码一致(来自 .NET Framework 4.8)。 Stream#Dispose() 打电话给Stream#Close()

    CryptoStream#FlushFinalBlock() (s. Remarks) 的文档说(正如您已经描述的那样):

    调用 Close 方法会调用 FlushFinalBlock。

    这再次与源代码一致(来自 .NET Framework 4.8)。 Close() 调用(除其他外)受保护的(虚拟)重载Dispose(true),它在CryptoStream 中被覆盖,请参阅CryptoStream#Dispose(bool disposing),如果尚未调用它,它会调用FlushFinalBlock()(即取决于@ 987654342@),

    这些细节描述在CryptoStream#Dispose(Boolean) (s. Remarks):

    此方法由公共 Dispose() 方法和 Finalize 方法调用。 Dispose() 调用受保护的 Dispose(Boolean) 方法,并将 disposing 参数设置为 true...

    【讨论】:

    • 感谢您提供这个非常明确的答案,当人们坚持让用户致电 FlushFinalBlock 而问题中的代码已经在使用 using 时,这应该是一个很好的问答:)
    猜你喜欢
    • 2018-03-11
    • 2015-01-02
    • 2020-02-26
    • 2017-10-04
    • 1970-01-01
    • 2011-08-27
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多