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

C#文件分割合并程序处理txt正常jpg合并后损坏问题咨询

问题根因排查

1. 核心BUG:分割逻辑读取原始文件的指针位置错误

你代码的分割逻辑中,把原始文件读取流的初始化放在了for循环内部,每次生成分片时都会重新调用File.OpenRead(name)打开原始文件,新打开的文件流读取指针默认处于文件起始位置,导致每次origin_read.ReadBytes(chunkSize)读取的都是文件开头最多1024字节的内容:

  • 你测试的.txt文件大小≤1024字节,仅生成1个分片,所以读取逻辑刚好正确,合并后内容无异常
  • 大于1024字节的.jpg文件会生成多个分片,所有分片内容都是文件开头的1024字节内容,合并后自然和原文件不一致

2. 次要问题:合并逻辑资源未释放

合并逻辑的循环中,每次打开分片的FileStream和BinaryReader后没有主动关闭,可能因为文件句柄被占用导致读取不完整,进一步加剧文件内容异常。

修复方案

分割逻辑修复

把原始文件读取流的初始化移到循环外部,复用同一个流,利用流读取指针自动后移的特性读取后续内容:

// 把这两行从for循环里移到外面
FileStream origin = File.OpenRead(name);
BinaryReader origin_read = new BinaryReader(origin);
for(int count = 1; count <= numberOfPart; count++)
{
    // 原有循环逻辑,删除循环内重复打开原始文件的代码
    // ...
}
origin_read.Close(); // 循环结束后再关闭流

合并逻辑修复

每个分片读取完成后主动关闭流,或者直接用using语句自动管理流的生命周期:

while(list_read.EndOfStream == false)
{
    string chunkName = list_read.ReadLine();
    using(FileStream chunk = File.OpenRead(chunkName))
    using(BinaryReader chunk_read = new BinaryReader(chunk))
    {
        FileInfo fileinfo = new FileInfo(chunkName);
        byte[] buffer = chunk_read.ReadBytes((int)fileinfo.Length);
        origin_write.Write(buffer);
    }
}

优化建议

所有IO操作都建议用using包裹流对象,不需要手动调用Close(),避免出现资源泄漏问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:27:04