簡體   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