Scal archiwa 7z


-1

Próbowałem pobrać archiwum 7z dwukrotnie i za każdym razem nie został pobrany w całości. Mam więc 2 częściowo pobrane pliki 2 GB i zgodnie z diagramem pobranych segmentów w programie menedżera pobierania powinno być możliwe połączenie ich w jeden kompletny plik.
Zastanawiam się, jaki jest najlepszy sposób, aby to zrobić?
Z góry dziękuję!


Jak rozproszone są kompletne części?
Dennis

Lubię to. 1st: ++++ ---- ++++++++, 2nd: +++++++++++ ----
Sergey Metlov

Podczas oczekiwania na odpowiedź napisałem program, aby znaleźć dziurę i teraz czekam na scalenie :)
Sergey Metlov

Jeśli to się uda, rozważ umieszczenie tutaj swojego rozwiązania.
Dennis

Więc nie pytasz o scalanie archiwów 7zip per se, a raczej łączenie dwóch niekompletnych plików? Zakładając dysk NTFS, czy są to rzadkie pliki? Jeśli nie, możesz rzeczywiście połączyć je, ale zależy to od tego, co znajduje się w otworach i jak możesz je wykryć. Przed laty napisałem program, aby robić dokładnie takie rzeczy, ale wymaga to, abyś był w stanie w jakiś sposób określić, który plik ma poprawne bajty na dowolnej pozycji.
Synetech

Odpowiedzi:


0

Spodziewałem się, że podasz mi dowolną nazwę programu do rozwiązania problemu i podczas oczekiwania na odpowiedź stworzyłem taki program sam. Prosty kod ( 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++;
                }
            }
        }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.