设计强大的文件格式编写器的指南?

Guidelines for designing a robust file format writer?

假设你想像这样编写一个 .WAV 文件格式的编写器:

using var stream = File.OpenRead("test.wav");
using var writer = new WavWriter(stream, ... /* .WAV format parameters */);

// write the file

// writer.Dispose() does a few things:
// - writes user-added chunks
// - updates the file header (chunk size) so the file is valid

这样做有一个概念问题:

您可以提出以下建议:

我猜你明白了...

对我来说,唯一可行的方法是记录这方面,但我可能遗漏了一些东西,因此提出了这个问题。

问题:

如何使文件格式编写器能够写入流,同时保护自己免受其位置可能发生的变化?

我的建议是在 WavWriter 中保留一个内部职位字段。每次执行某些操作时,您都可以检查它是否与后备流中的位置匹配,如果不匹配则抛出异常。在每次写入操作结束时更新此值。

理想情况下,您还应该处理不支持搜索的流,但听起来您的设计无论如何都不允许这样做。在构造函数中检查 CanSeek 并在不支持搜索时抛出可能是个好主意。在使用之前验证任何参数通常是个好主意。