Технические вопросы и ответы QA1518

Используя UTIs для идентификации файлов образа

Q: Как я могу использовать Универсальные Идентификаторы типов (UTIs), чтобы определить, является ли данный путь к файлу файлом образа?

A: Как я могу использовать Универсальные Идентификаторы типов (UTIs), чтобы определить, является ли данный путь к файлу файлом образа?

Можно определить, является ли данный файл, на основе его пути к файлу, файлом образа путем сравнения его UTI через платформу Launch Services с поддерживаемым UTIs от Изображения платформа I/O.

Перечисление 1  , Определяющее, является ли путь к файлу файлом образа.

- (BOOL)isImageFile:(NSString*)filePath
{
    BOOL isImageFile = NO;
    FSRef fileRef;
    Boolean isDirectory;

    if (FSPathMakeRef((const UInt8 *)[filePath fileSystemRepresentation], &fileRef, &isDirectory) == noErr)
    {
        // get the content type (UTI) of this file
        CFDictionaryRef values = NULL;
        CFStringRef attrs[1] = { kLSItemContentType };
        CFArrayRef attrNames = CFArrayCreate(NULL, (const void **)attrs, 1, NULL);

        if (LSCopyItemAttributes(&fileRef, kLSRolesViewer, attrNames, &values) == noErr)
        {
            // verify that this is a file that the Image I/O framework supports
            if (values != NULL)
            {
                CFTypeRef uti = CFDictionaryGetValue(values, kLSItemContentType);
                if (uti != NULL)
                {
                    CFArrayRef supportedTypes = CGImageSourceCopyTypeIdentifiers();
                    CFIndex i, typeCount = CFArrayGetCount(supportedTypes);

                    for (i = 0; i < typeCount; i++)
                    {
                        CFStringRef supportedUTI = CFArrayGetValueAtIndex(supportedTypes, i);

                        // make sure the supported UTI conforms only to "public.image" (this will skip PDF)
                        if (UTTypeConformsTo(supportedUTI, CFSTR("public.image")))
                        {
                            if (UTTypeConformsTo(uti, supportedUTI))
                            {
                                isImageFile = YES;
                                break;
                            }
                        }
                    }

                    CFRelease(supportedTypes);
                }

                CFRelease(values);
            }
        }

        CFRelease(attrNames);
    }

    return isImageFile;
}

Если Вы требуете другого UTIs, не связанного с файлами образа или ImageIO, вместо CGImageSourceCopyTypeIdentifiers() можно использовать следующий -

CFArrayRef UTICreateAllIdentifiersForTag(CFStringRef inTagClass, CFStringRef inTag, CFStringRef inConfirmingToUTI);

Связанная документация



История версии документа


ДатаПримечания
11.05.2007

Новый документ, объясняющий, как использовать Универсальные Идентификаторы типов для идентификации, какие файлы могут быть открыты в изображениях.