You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FileStream的Append模式为何无法追加字节数组而是覆盖原有文件

C# FileMode.Append模式写入异常问题

问题描述

业务场景需要多次将字节数组写入文件,设置文件打开模式为FileMode.Append,按照该模式的定义:文件不存在时会自动创建,文件存在时则打开并定位到末尾写入。
但实际运行时发现,写入已有文件会直接覆盖原有内容,而非追加新的字节数组,运行全过程无任何报错,手动调用FileStream.Seek方法也无效果。覆盖后写入的新数据本身正确性无问题,但不符合追加写入的需求。
原始实现代码如下:

void WriteToFile()
{
    byte[] buffer = new byte[16 * 1024];
    int num;

    using (FileStream dest_stream = new FileStream(filename, FileMode.Append, FileAccess.Write))
    {
        while (num = ReadFromAnotherStream(my_other_stream, ref buffer) > 0)
            dest_stream.Write(buffer, 0, num);
    }
}

该函数会被不定时触发调用,预期行为是:文件存在就定位到末尾续写,不存在则新建文件写入。

最终解决方案

最终采用临时文件预写入+最终合并的方案实现需求:每次调用写入函数时,先将内容写入独立的临时文件,所有写入操作完成后,再统一合并到主文件中。
该方案运行稳定,不需要手动调用Seek操作也不会出现文件损坏问题,缺点是合并多个大体积临时文件时会产生额外的性能开销。
对应实现伪代码如下:

  1. 生成唯一临时文件名
string filename;
List<string> tmp_files = new List<string>();
int __i = 0;
do
{
    filename = $"my_file.tmp{__i++}";
    tmp_files.Add(filename);
}
while (File.Exists(filename));
  1. 临时文件合并逻辑
// 所有写入操作完成后执行合并逻辑
using (FileStream out_fs = new FileStream("my_file.bin", FileMode.Create))
{
    foreach (string tmp_file in tmp_files)
    {
        using (FileStream in_fs = new FileStream(tmp_file, FileMode.Open))
        {
            in_fs.CopyTo(out_fs);
        }
        File.Delete(tmp_file);
    }
}

目前暂未定位到FileMode.Append模式失效的具体原因,已排除输入流导致问题的可能性。


内容的提问来源于stack exchange,提问作者IOviSpot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:54:03