ما هي طريقة جيدة لاختبار ملف لمعرفة ما إذا كان ملف zip؟

StackOverflow https://stackoverflow.com/questions/1887041

سؤال

أنا أبحث عن مواصفات تنسيق ملف جديد وتقول المواصفات أن الملف يمكن أن يكون إما يعمل XML أو ملف مضغوط يحتوي على ملف XML وملفات أخرى.

ملحق الملف هو نفسه في كلتا الحالتين. ما هي الطرق التي يمكنني اختبار الملف لتقرير ما إذا كانت تحتاج إلى إلغاء ضغط أو مجرد قراءة؟

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

المحلول

يتم تعريف تنسيق ملف ZIP بواسطة PKWare. يمكنك العثور على مواصفات الملف الخاصة بهم هنا.

بالقرب من الجزء العلوي سوف تجد مواصفات الرأس:

A. رأس الملف المحلي:

    local file header signature     4 bytes  (0x04034b50)
    version needed to extract       2 bytes
    general purpose bit flag        2 bytes
    compression method              2 bytes
    last mod file time              2 bytes
    last mod file date              2 bytes
    crc-32                          4 bytes
    compressed size                 4 bytes
    uncompressed size               4 bytes
    file name length                2 bytes
    extra field length              2 bytes

    file name (variable size)
    extra field (variable size)

من هذا، يمكنك أن ترى أن أول 4 بايت من الرأس يجب أن يكون توقيع الملف الذي يجب أن يكون قيمة HEX 0x04034B50. بايت النظام في الملف هو الاتجاه الآخر جولة - pkware حدد أن "يتم تخزين جميع القيم في أمر بايت هندي صغير ما لم ينص على خلاف ذلك."، لذلك إذا كنت تستخدم محرر HEX لعرض الملف، سترى 50 4B 03 04 أول 4 بايت.

يمكنك استخدام هذا للتحقق مما إذا كان الملف الخاص بك هو ملف مضغوط. إذا قمت بفتح الملف في المفكرة، فستلاحظ أن أول اثنين من البايتين (50 و 4 ب) هي أحرف ASCII PK.

نصائح أخرى

يمكنك أن تنظر إلى رقم السحر من الملف. يتم سرد تلك للأرشيفات الرمز البريدي في إطار الرمز البريدي ويكيبيديا: PK\003\004 or PK\005\006.

تحقق من البايت القليلة الأولى من الملف ل رقم السحر. وبعد تبدأ ملفات ZIP مع PK (50 4B). كملفات XML لا يمكن أن تبدأ بهذه الأحرف ولا تزال صالحة، يمكنك أن تكون متأكدا إلى حد ما من نوع الملف.

يمكنك استخدام ملف لمعرفة ما إذا كان ذلك ملف نصي (XML) أو قابل للتنفيذ (ZIP). قم بالتمرير لأسفل لرؤية مثال.

ليس حل جيد رغم ذلك، ولكن مجرد التفكير في التحميل ... ماذا عن:

try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}

يمكنك التحقق من الملف لمعرفة ما إذا كان يحتوي على رأس XML صالح. إذا لم يحدث ذلك، فحاول إلغاء ضغطه.

يرى انقر هنا للحصول على مواصفات XML.

ملف الأرقام السحرية

لتوضيح، يبدأ ب 50 4B 03 04.

يرى http://www.pkware.com/documents/casestudies/appnote.txt. (من سيمون ع ستيفنز)

يمكنك تجربة Unzipping IT - من غير المرجح أن يكون ملف XML من غير المرجح أن يكون ملف zip صالحا، أو يمكن التحقق من الأرقام السحرية، كما قال آخرون.

ذلك يعتمد على ما تستخدمه ولكن قد تحتوي مكتبة الرمز البريدي على وظيفة التي تختبر Wether a ملف أم لا هو ملف مضغوط شيء مثل IS_ZIP، TEST_FILE_ZIP أو أيا كان ...

أو إنشاء وظيفة خاصة بك باستخدام الرقم السحري المذكور أعلاه.

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