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

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

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

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

0x50, 0x4b, 0x03, 0x04 

所以读取前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 ... } } 

尝试这个

 NSWorkspace *ws = [NSWorkspace sharedWorkspace]; NSString *description = [ws localizedDescriptionForType:[ws typeOfFile:@"/full/path/to/file" error:nil]]; 

或者对于哑剧而言

 + (NSString*) mimeTypeForFileAtPath: (NSString *) path { if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { return nil; } CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)[path pathExtension], NULL); CFStringRef mimeType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType); CFRelease(UTI); if (!mimeType) { return @"application/octet-stream"; } return [NSMakeCollectable((NSString *)mimeType) autorelease]; } 

我只是使用文件 ,然后grep如果它有文本“zip”或“Zip存档”是安全的。

 if file -q $FILENAME | grep "Zip archive"; then echo "zip"; else echo "not zip"; fi