Aeo*_*058 0 c# copy file offset
我有一堆非常大的视频文件(.ts),范围从3GB到10GB.其中很多都有一个特定的错误,我的解决方案是简单地删除包含错误的部分.我认识的开始和结束偏移,因为我想保留的部分,我希望从start_offset在主文件中简单地读取并复制到end_offset到在同一个文件夹中的新文件.
例如,我有主视频MAIN.ts,它是5.5GB.假设它有两个错误.我想保留偏移量(十进制,而不是十六进制)0到1174698823(错误开始前的字节)并将其保存到新文件PART1.ts.然后我想通过偏移4126897791(第二个错误开始)保留偏移1257553244(错误结束后的字节)并保存为PART2.ts.然后我需要将文件末尾的偏移量4207333028保存为PART3.ts.基本上我只删除了大约155MB的文件并将其分成三部分.如果我能真正做到削减,而不创建多个新文件,而是把它们添加对方为我去,然后写整个新的文件,这将是一个奖金(或我可以只使用copy /b更高版本).
我一直在研究文件流和字节数组,我知道2GB的限制.我如何解决这个问题,然后如果我想要保留的块的长度大于2GB,我该如何编写它?我不确定如何使用有限长度的缓冲区来执行此操作.如果可能的话,我也希望有一个进度条来显示已经写了多少.
任何帮助,将不胜感激.
您绝对不需要创建新文件.您只需打开一次输出文件和输入文件一次,然后通过在输入文件中搜索来附加块,然后将一个部分从输入流复制到输出流,然后再转到下一部分.
 using (var output = File.Create("output.ts"))
 using (var input = File.OpenRead("input.ts"))
 {
     AppendChunk(output, input, 0, 1174698823L);
     AppendChunk(output, input, 1257553244L, 4126897791L);
 }
 ...
 private static void AppendChunk(Stream output, Stream input,
                                 long start, long end)
 {
     // TODO: Argument validation
     long size = end - start;
     byte[] buffer = new byte[32 * 1024]; // Copy 32K at a time
     input.Position = start;
     while (size > 0)
     {              
         int bytesRead = input.Read(buffer, 0, Math.Min(size, buffer.Length));
         if (bytesRead <= 0)
         {
             throw new EndOfStreamException("Not enough data");
         }
         output.Write(buffer, 0, bytesRead);
         size -= bytesRead;
     }
 }
要集成进度条,您需要预先计算要复制的总大小,然后在循环中增加到目前为止复制的总数,并以此方式更新进度条.不要忘记,如果这是在WinForms或WPF中,您不应该在UI线程上执行任何IO工作.
| 归档时间: | 
 | 
| 查看次数: | 954 次 | 
| 最近记录: |