繁体   English   中英

在C#中将偏移量复制到文件的偏移量

[英]Copying offset to offset from file in C#

我有一堆非常大的视频文件(.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工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM