C#如何将MailMerger返回的Stream类型转换为FileStream类型
解决方案
核心原因
你直接强转会失败的根本原因是:FileStream是专门和磁盘物理文件绑定的Stream子类,你调用MailMerger的Merge方法返回的outputStream本质上是MemoryStream这类内存流实例,和磁盘文件没有任何关联,不存在合法的直接类型转换方式,只能通过流内容复制实现需求。
实现方案
你需要先指定一个磁盘文件路径用于创建FileStream,再将outputStream的全部内容复制到新创建的FileStream中即可,注意需要先将outputStream的指针重置到流的起始位置,避免复制为空。
修正后的代码如下:
static FileStream IMailMergeService(Dictionary<string, string> dataSource, Stream stream) { var (outputStream, errors) = new MailMerger().Merge(stream, dataSource); // 重置流指针到起始位置 outputStream.Seek(0, SeekOrigin.Begin); // 替换为你实际需要写入的磁盘文件路径 string targetFilePath = @"C:\your\target\path\merged-file.docx"; // 创建新的FileStream var fileStream = new FileStream(targetFilePath, FileMode.Create, FileAccess.ReadWrite); // 将内存流内容复制到FileStream outputStream.CopyTo(fileStream); // 重置FileStream指针到起始位置,方便调用方直接读取 fileStream.Seek(0, SeekOrigin.Begin); return fileStream; }
注意事项
- 上述代码中
targetFilePath需要替换为你业务场景下实际需要存储合并后文件的路径 - 代码中返回的
errors变量包含合并过程中的错误信息,你可以根据业务需要增加错误判断逻辑,避免生成无效文件 - 调用方拿到返回的
FileStream实例使用完毕后,必须手动调用Dispose方法释放资源,避免文件占用 - 如果你的业务场景不需要持久化文件到磁盘,建议直接修改方法返回类型为
Stream,无需额外做流复制,性能更高
内容的提问来源于stack exchange,提问作者Hadi Hoteit
相关产品推荐
相关产品推荐

