如何确定文件是否为zip文件?

use*_*127 7 cocoa-touch objective-c ios

我需要确定我的应用程序文档目录中的文件是否是zip文件.文件名不能用于进行此确定.所以我需要能够读取MIME类型或找到一些仅适用于拉链的其他属性.

注意:需要将整个文件放入内存的解决方案并不理想,因为文件可能非常大.

Mar*_*n R 10

根据http://www.pkware.com/documents/casestudies/APPNOTE.TXT,ZIP文件以"本地文件头签名"开头

0x50, 0x4b, 0x03, 0x04
Run Code Online (Sandbox Code Playgroud)

所以读取前4个字节就足以检查文件是否可能是ZIP文件.只有在您真正尝试提取文件时才能做出明确的决定.

许多方法可以读取文件的前4个字节.您可以使用NSFileHandle,NSInputStream,打开/读取/关闭,.... 所以这只应该作为一个可能的例子:

NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:@"/path/to/file"];
NSData *data = [fh readDataOfLength:4];
if ([data length] == 4) {
    const char *bytes = [data bytes];
    if (bytes[0] == 'P' && bytes[1] == 'K' && bytes[2] == 3 && bytes[3] == 4) {
        // File starts with ZIP magic ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 4版本:

if let fh = FileHandle(forReadingAtPath: "/path/to/file") {
    let data = fh.readData(ofLength: 4)
    if data.starts(with: [0x50, 0x4b, 0x03, 0x04]) {
        // File starts with ZIP magic ...
    }
    fh.closeFile()
}
Run Code Online (Sandbox Code Playgroud)