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

Ios 如何确定文件是否为zip文件?,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我需要确定应用程序文档目录中的文件是否为zip文件。无法使用文件名进行此确定。因此,我需要能够读取MIME类型或找到仅适用于ZIP的其他属性 注意:需要将整个文件放入内存的解决方案并不理想,因为文件可能非常大。试试这个 NSWorkspace *ws = [NSWorkspace sharedWorkspace]; NSString *description = [ws localizedDescriptionForType:[ws typeOfFile:@"/full/path/to/file

我需要确定应用程序文档目录中的文件是否为zip文件。无法使用文件名进行此确定。因此,我需要能够读取MIME类型或找到仅适用于ZIP的其他属性

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

试试这个

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];
}
根据,, ZIP文件以“本地文件头签名”开头

因此,读取前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 ...
    }
}
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()
}

我只需要使用文件,然后使用grep,如果它有文本“zip”或“zip存档”以确保安全

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

由于.zip和.xlsx具有相同的幻数,因此我找不到有效的zip文件(如果重命名)

因此,我使用ApacheTika来查找确切的文档类型

即使将文件类型重命名为zip,它也会找到确切的类型


参考

您正在使用什么网络服务下载文件?我没有测试您的第二个示例,但第一个示例肯定使用了文件名。即使内容是有效的ZIP存档文件,它也不会将“file.abc”识别为ZIP文件。我如何才能只读取前4个字节,并对照该签名进行检查?有趣的是,不同意这一点,只说这个头是常见的。@JWWalker:是的,这很有趣。ZIP格式是由PKWARE引入的(据我所知),所以我一直使用他们的文档作为明确的文档。到目前为止,这种方法一直有效。
List.exe
在这方面效果很好-每次我想查看一些二进制数据时,宁愿使用一个小的Windows实用程序,也不要运行自定义程序。文件名可以始终为spoofed@NateH06这不是查看文件名。它正在运行file命令。这实际上会检测到zip文件,即使文件的扩展名是错误的。
if file -q $FILENAME | grep "Zip archive"; then
  echo "zip";
else
  echo "not zip";
fi