-1

Я пытался скачать архив 7z дважды, и оба раза он не был загружен полностью. Таким образом, у меня есть 2 частично загруженных файла по 2 ГБ, и согласно диаграмме загруженных сегментов в программе менеджера загрузки должна быть возможность объединить их в один законченный файл.
Поэтому мне интересно, каков наилучший способ сделать это?
Заранее спасибо!

1 ответ1

0

Я ожидал, что вы дадите мне любое название программы, чтобы решить проблему, и в ожидании ответа я создал такую программу сам. Простой код (C#):

static void Main(string[] args)
{
    int fails = 0;
    long failStart = 0;
    long failEnd = 0;

    const string fileWithHole = @"c:\Downloads\1\eveonline_395875_1of2.7z";
    const string fileFilledWhereHole = @"c:\Downloads\eveonline_395875_1of2.7z";

    // Copy of the 1st one to repair the hole:
    const string targetFile = @"d:\Eve\eveonline_395875_1of2.7z";

    using (var br = new BinaryReader(new FileStream(fileWithHole, FileMode.Open)))
    {
        long pos = 0;
        long len = br.BaseStream.Length;

        using (var br1 = new BinaryReader(new FileStream(fileFilledWhereHole, FileMode.Open)))
        {
            using (var w = File.OpenWrite(targetFile))
            {
                // As I know that hole is in the 1st half of file:
                while (pos < len/2)
                {
                    byte b = br.ReadByte();
                    byte b1 = br1.ReadByte();

                    // 1 MB to log:
                    if (pos%1000000 == 0)
                    {
                        Console.Clear();
                        Console.WriteLine("{0} MB", pos/1000000);
                        Console.WriteLine("FAILS: {0}", fails);
                        Console.WriteLine("FROM {0} TO {1}", failStart, failEnd);
                    }

                    if (b != b1)
                    {
                        fails++;

                        if (failStart == 0)
                        {
                            failStart = pos;
                            w.Seek(pos, SeekOrigin.Begin);
                        }
                        failEnd = pos;

                        // Repair the hole in copied file:
                        w.WriteByte(b);
                    }

                    pos++;
                }
            }
        }
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .