2009-12-11 15 views

Trả lời

20

Định dạng tệp zip được xác định bởi PKWARE. Bạn có thể tìm thấy đặc điểm kỹ thuật tập tin của họ here.

Gần đầu bạn sẽ tìm thấy đặc điểm kỹ thuật tiêu đề:

A. phần đầu tập tin địa phương:

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) 

Từ đây bạn có thể thấy rằng 4 byte đầu tiên của tiêu đề nên chữ ký tệp phải là giá trị hex 0x04034b50. Thứ tự byte trong tập tin là cách khác vòng - PKWARE xác định rằng "Tất cả các giá trị được lưu trữ theo thứ tự byte nhỏ, trừ khi có quy định khác", vì vậy nếu bạn sử dụng trình chỉnh sửa hex để xem tệp, bạn sẽ thấy 50 4b 03 04 như 4 byte đầu tiên.

Bạn có thể sử dụng quyền này để kiểm tra xem tệp của bạn có phải là tệp zip hay không. Nếu bạn mở tệp trong notepad, bạn sẽ thấy rằng hai byte đầu tiên (50 và 4b) là ký tự ASCII PK.

+0

+1 Thông tin tuyệt vời. Nhưng lý tưởng, nó sẽ thay đổi từ nhà cung cấp đến nhà cung cấp, có nghĩa là thuật toán nén. –

+1

http://en.wikipedia.org/wiki/ZIP_(file_format) –

+4

Định dạng tệp ZIP không thay đổi tùy theo nhà cung cấp. Nó được định nghĩa ban đầu bởi PKWARE, nhưng nhiều nhà cung cấp khác hiện hỗ trợ định dạng nén tương tự. Định dạng này chỉ định PK trong tiêu đề, vì vậy ngay cả các nhà cung cấp khác sẽ vẫn bao gồm phần này của tiêu đề. Các định dạng tệp khác nhau như arc, 7z, lhz, gzip, vv sẽ có các thông số kỹ thuật khác nhau và các tiêu đề khác nhau, nhưng tệp zip sẽ luôn có định dạng này trong tiêu đề. –

12

Bạn có thể xem magic number của tệp. Tài liệu lưu trữ ZIP được liệt kê trên ZIP format wikipedia page: PK\003\004 or PK\005\006.

+0

Yep, nhưng chỉ nên op bí quyết ... một 'con số kỳ diệu hợp lệ' không đảm bảo rằng các tập tin không phải là bị hỏng hoặc của một loại sai. –

+2

Thật vậy. Tuy nhiên, nếu vấn đề của họ chỉ khác biệt giữa hai định dạng hợp lệ, thì số ma thuật là con đường để đi. – Amber

+0

Không có số ma thuật cho tệp zip. Thông thường, các tệp zip bắt đầu bằng các chuỗi này, nhưng không phải mọi tệp zip đều hoạt động. – Cheeso

1

Kiểm tra một vài byte đầu tiên của tệp cho magic number. Các tệp zip bắt đầu bằng PK (50 4B). Vì các tệp XML không thể bắt đầu bằng các ký tự này và vẫn hợp lệ, bạn có thể khá chắc chắn về kiểu tệp.

+1

Không có số ma thuật cho các tệp zip. Nếu Wikipedia nói hoặc gợi ý rằng có, nó sai. – Cheeso

+1

@Cheeso Có. Vui lòng đọc định dạng http://www.pkware.com/documents/casestudies/APPNOTE.TXT và lưu ý "chữ ký đầu trang tệp cục bộ" và giá trị được xác định của nó. – Yacoby

+1

Tôi hiểu tại sao bạn nghĩ rằng, từ việc đọc văn bản, nhưng nó không chính xác. Văn bản mờ, nhưng trong thực tế, không có số ma thuật. http://en.wikipedia.org/wiki/ZIP_(file_format) cũng như kinh nghiệm thực tế chứng minh rằng bạn đang diễn giải thông số không chính xác, với giả định số ma thuật. Kiểm tra bản lưu trữ Tự giải nén được tạo bởi WinZip hoặc Infozip. Nó là cả tệp PE-COFF và tệp zip. Nó sử dụng số ma thuật MZ, nhưng có thể được đọc dưới dạng zipfile bằng các công cụ ZIP tương thích. – Cheeso

-1

Chỉ cần kiểm tra xem các byte đầu tiên của tệp có phải là biểu tượng ASCII hay không. Nếu có, thì bạn có XML là tệp văn bản thông thường. Nếu không - bạn đã nén dữ liệu.

Đối với các tình huống phức tạp hơn, bạn có thể cần phải kiểm tra Magic Number.

+0

* Các tệp ZIP luôn bắt đầu bằng 4 byte trong phạm vi ASCII * Có thể tệp ZIP được cấu thành hoàn toàn bằng byte trong phạm vi ASCII * Điều gì xảy ra nếu tệp XML sử dụng mã hóa sử dụng byte ngoài phạm vi ascii? Giống như bất kỳ tệp UTF8/16/32 nào có BOM hoặc với các ký tự không phải là chữ cái Latinh? –

+0

KHÔNG, tệp zip không phải lúc nào cũng bắt đầu bằng 4 byte trong phạm vi ASCII. Tệp zip KHÔNG cũng luôn bắt đầu bằng PK hoặc 50 4b. Sự hiểu lầm là rất phổ biến, nhưng vẫn sai. – Cheeso

0

Bạn có thể thử giải nén nó - một tệp XML không thể là tệp zip hợp lệ hoặc có thể kiểm tra số ma thuật, như những người khác đã nói.

1

Bạn có thể sử dụng file để xem nếu nó là một tập tin văn bản (xml) hoặc tệp thực thi (zip). Cuộn xuống để xem ví dụ.

+0

oops, tôi nghĩ sẽ có một tệp gọi hệ thống(). – ccheneson

0

nó phụ thuộc vào những gì bạn đang sử dụng nhưng thư viện zip có thể có một chức năng kiểm tra thời tiết một tập tin hoặc không phải là một tập tin zip cái gì đó như is_zip, test_file_zip hoặc bất cứ điều gì ...

hoặc tạo bạn chức năng riêng bằng cách sử dụng số ma thuật được đưa ra ở trên.

+0

Không có số ma thuật cho tệp zip. – Cheeso

1

Không phải là giải pháp tốt, nhưng chỉ nghĩ ra tải ...về:

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

Tôi đã bỏ phiếu cho điều này, tuy nhiên cá nhân tôi không thích sử dụng try catch để kiểm soát chương trình. Tôi đang tìm một bài kiểm tra chính xác hơn. Cảm ơn cho đầu vào của bạn mặc dù. –

+0

Tôi đồng ý - quy tắc ngón tay cái là try/catch không bao giờ được sử dụng trong luồng chương trình * bình thường * (nó làm chậm mọi thứ xuống một vài bậc độ lớn, và, về mặt triết học, móng tay giống như trên bảng đen). – Contango

1

Bạn có thể kiểm tra tệp để xem tệp có chứa tiêu đề XML hợp lệ hay không. Nếu không, hãy thử giải nén nó.

Xem Click here for XML specification.