使用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操作也不会出现文件损坏问题,缺点是合并多个大体积临时文件时会产生额外的性能开销。
对应实现伪代码如下:
- 生成唯一临时文件名
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));
- 临时文件合并逻辑
// 所有写入操作完成后执行合并逻辑 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
相关产品推荐
相关产品推荐

