سؤال

وأنا أمسك التعليمة البرمجية التالية في مكان ما من الانترنت، وأنا استخدامه لضغط الملفات GZIP، مثل <وأ href = "http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/ v1.8.4 / SRC / pgadmin3-1.8.4.tar.gz "يختلط =" نوفولو noreferrer "> http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz ، ولكن عندما يتم تشغيله، وأحصل على استثناء، مشيرا إلى أن الرقم السحري لا تتطابق.

public byte[] Download(string pUrl) {
    WebClient wc = new WebClient();
    byte[] bytes = wc.DownloadData(pUrl);
    return UnGzip(bytes, 0);
}

private static byte[] UnGzip(byte[] data, int start) {
    int size = BitConverter.ToInt32(data, data.Length - 4);
    byte[] uncompressedData = new byte[size];
    MemoryStream memStream = new MemoryStream(data, start, (data.Length - start));
    memStream.Position = 0;
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);

    try {
        gzStream.Read(uncompressedData, 0, size);
    } catch (Exception gzError) {
        throw;
    }

    gzStream.Close();
    return uncompressedData;
}

ما هو الخطأ في التعليمات البرمجية التي من شأنها أن تسبب هذه المشكلة؟

هل كانت مفيدة؟

المحلول

والمشكلة هي أن URL الذي حددته في سؤالك لا يعطي ملف غزيب الواقع. فإنه يأخذ المتصفح إلى صفحة حيث يمكنك اختيار المرآة.

إذا مؤقتا تغيير طريقة Download لاستخدام:

string text = wc.DownloadString(pUrl);
Console.WriteLine(text);

وسترى كل HTML لاختيار المرآة.

إذا كنت تستخدم URL الذي هو الفعلي ملف جي زد، على سبيل المثال HTTP: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz ثم فإنه يعمل بشكل جيد.

نصائح أخرى

وأنا لم أستطع الحصول على GZipStream لقراءة الملف الذي يرتبط، ولكن يبدو أن ضغط الملفات غزيب أخرى على ما يرام. على سبيل المثال:

بروتوكول نقل الملفات: // حكومة الوحدة الوطنية .mirror.iweb.com / جنو / سحق / باش-1.14.0-1.14.1.diff.gz

بروتوكول نقل الملفات: //gnu.mirror .iweb.com / جنو / ايماكس / elisp-دليل-21-2.8.tar.gz

ولعل الملف الذي يرتبط هو الفاسد؟ أو ربما يستخدم تنسيق غزيب غير القياسية أو جديدة.

ولقد استعملت DotNetZip مع بعض النجاح مع ملفات .zip. ووفقا للمستندات يعمل أيضا مع غزيب. كنت قد يعطي مكتبة هذا الرجل المحاولة.

و.NET لا تدعم القطران الشكل. gzip هو مجرد ضاغط بايت. القطران هو شكل الحاوية.

ZIP و <لأ href = "HTTP: // en.wikipedia.org/wiki/RAR "يختلط =" نوفولو noreferrer "> RAR ، يجمع بين كل هذه الخطوات بالنسبة لك، ولكنها ليست جيدة لتدفق ضغط.

إذا كنت أتذكر بشكل صحيح، SharpZipLib يحظى بدعم لالقطران.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top