私は新しいファイル形式の仕様を探しています。仕様では、ファイルは xml ベースにすることも、xml ファイルとその他のファイルを含む zip ファイルにすることもできます。
どちらの場合もファイル拡張子は同じです。ファイルをテストして、解凍する必要があるか、単に読み取る必要があるかを判断するには、どのような方法がありますか?
私は新しいファイル形式の仕様を探しています。仕様では、ファイルは xml ベースにすることも、xml ファイルとその他のファイルを含む zip ファイルにすることもできます。
どちらの場合もファイル拡張子は同じです。ファイルをテストして、解凍する必要があるか、単に読み取る必要があるかを判断するには、どのような方法がありますか?
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 バイトは、16 進値 0x04034b50 であるファイル署名である必要があることがわかります。ファイルのバイト順は逆です。PKWARE では、「特に指定がない限り、すべての値はリトル エンディアンのバイト順で格納される」と指定されているため、16 進エディタを使用してファイルを表示すると、50 4b 03 04 が次のように表示されます。最初の 4 バイト。
これを使用して、ファイルが zip ファイルであるかどうかを確認できます。ファイルをメモ帳で開くと、最初の 2 バイト (50 と 4b) が ASCII 文字 PK であることがわかります。
ファイルのマジックナンバーを見ることができます。ZIP アーカイブ用のものは、ZIP 形式のウィキペディア ページにリストされていますPK\003\004 or PK\005\006
。
明確にするために、それは50 4b0304で始まります。
http://www.pkware.com/documents/casestudies/APPNOTE.TXT(Simon P Stevensから)を参照してください
fileを使用して、それがテキストファイル(xml)であるか実行可能ファイル(zip)であるかを確認できます。下にスクロールして例を確認します。
ファイルの最初の数バイトでマジック ナンバーを確認します。Zip ファイルは PK (50 4B) で始まります。XML ファイルはこれらの文字で始まることはできず、依然として有効であるため、ファイルの種類についてかなりの確信が持てます。
ただし、良い解決策ではありませんが、負荷を考えているだけです...どうですか:
try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
ファイルをチェックして、有効な XML ヘッダーが含まれているかどうかを確認できます。そうでない場合は、解凍してみてください。
XML 仕様については、ここをクリックしてくださいを参照してください。
使用しているものによって異なりますが、zipライブラリには、ファイルがis_zip、test_file_zipなどのzipファイルであるかどうかをテストする関数がある場合があります...
または、上記のマジックナンバーを使用して独自の関数を作成します。
あなたはそれを解凍してみることができます.XMLファイルは有効なzipファイルである可能性は非常に低いか、他の人が言っているようにマジックナンバーをチェックする可能性があります.