Question

Je cherche une nouvelle spécification de format de fichier et la spécification dit que le fichier peut être basé sur XML ou un fichier zip contenant un fichier xml et d'autres fichiers.

L'extension de fichier est le même dans les deux cas. Quels sont les moyens que je pourrais tester le fichier pour décider si elle a besoin ou tout simplement lire décompresser?

Était-ce utile?

La solution

Le format de fichier zip est défini par PKWARE. Vous pouvez trouver leur spécification de fichier .

Près du haut, vous trouverez les spécifications d'en-tête:

  

A. en-tête de fichier local:

    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)

De cela, vous pouvez voir que les 4 premiers octets de l'en-tête doit être la signature du fichier qui doit être la valeur hexadécimale 0x04034b50. Ordre des octets dans le fichier est dans l'autre sens - PKWARE précisent que « Toutes les valeurs sont stockées dans l'ordre little-endian, sauf indication contraire. », Donc si vous utilisez un éditeur hexadécimal pour afficher le fichier que vous verrez 50 4b 03 04 comme les 4 premiers octets.

Vous pouvez l'utiliser pour vérifier si votre fichier est un fichier zip. Si vous ouvrez le fichier dans le bloc-notes, vous remarquerez que les deux premiers octets (50 et 4b) sont les caractères ASCII PK.

Autres conseils

Vérifier les premiers octets du fichier pour les nombre magique . Les fichiers Zip commencent par PK (50 4B). Comme les fichiers XML ne peuvent pas commencer par ces caractères et être toujours valide, vous pouvez être assez sûr que le type de fichier.

Vous pouvez utiliser pour voir si elle est un fichier texte (XML) ou un exécutable (zip). Faites défiler la liste pour voir un exemple.

Pas une bonne solution si, mais juste de penser à haute voix ... Que diriez-vous:

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

Vous pouvez vérifier le fichier pour voir si elle contient un en-tête XML valide. Si elle ne le fait pas, essayez de le décompresser.

Voir Cliquez ici pour la spécification XML.

Fichier nombres magiques

Pour clarifier, il commence par 50 4b 03 04.

Voir http://www.pkware.com/documents/casestudies/APPNOTE. TXT (De Simon P Stevens)

Vous pouvez essayer de le décompresser - un fichier XML est très peu susceptible d'être un fichier zip valide ou pouvez vérifier les numéros magiques, comme d'autres ont dit

.

cela dépend de ce que vous utilisez, mais la bibliothèque zip peut avoir une fonction tester wether un fichier ou non est un fichier zip quelque chose comme is_zip, test_file_zip ou autre ...

ou vous créer êtes propre fonction en utilisant le nombre magique donné ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top