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
相关产品推荐
相关产品推荐

