检查文件扩展名是否有效

时间:2014-03-24 19:21:08

标签: ios cocoa-touch validation file-extension

我试图使用[string pathExtension]获取文件扩展名,但这并不总是返回文件扩展名本身。例如:我有一个名为' Example.png'的文件,当我使用这种方法时,我得到了' png'哪个是对的。现在让我们说我有一个没有扩展名的文件,例如'示例',我得到的nil仍然是正确的。当我有一个类似于' Example.109'的文件时会发生什么?我得到了109'作为不正确的扩展名。它恰好发生在' .109'是文件名本身的一部分。有没有办法验证这个?

1 个答案:

答案 0 :(得分:3)

我认为有效文件扩展名的含义是一个文件扩展名,系统上有一个声明/声明该扩展名的应用程序。

您可以使用以下代码轻松确定:

NSString *pathExtension = [@"Example.109" pathExtension];

NSLog(@"pathExtension == %@", pathExtension);

CFStringRef utiType = UTTypeCreatePreferredIdentifierForTag(
       kUTTagClassFilenameExtension, (__bridge CFStringRef)pathExtension, NULL);

NSLog(@"utiType == %@", utiType);

CFDictionaryRef declaration = UTTypeCopyDeclaration(utiType);

NSLog(@"declaration == %@", declaration); // will likely print (null)


CFStringRef jpgUTIType = UTTypeCreatePreferredIdentifierForTag(
         kUTTagClassFilenameExtension, CFSTR("jpg"), NULL);

NSLog(@"jpg's UTI Type == %@", jpgUTIType);

CFDictionaryRef knownDeclaration = UTTypeCopyDeclaration(jpgUTIType);

NSLog(@"knownDeclaration == %@", knownDeclaration);

if (utiType) CFRelease(utiType);
if (knownFilenameExtensionsUTIType) CFRelease(knownFilenameExtensionsUTIType);
if (declaration) CFRelease(declaration);
if (knownDeclaration) CFRelease(knownDeclaration);

这可能会将以下内容打印到控制台:

pathExtension == 109
utiType == dyn.age8xcqb3
declaration == (null)

jpg's UTI Type == public.jpeg
knownDeclaration == {
    UTTypeConformsTo = "public.image";
    UTTypeDescription = "JPEG image";
    UTTypeIdentifier = "public.jpeg";
    UTTypeTagSpecification =     {
        "com.apple.ostype" = JPEG;
        "public.filename-extension" =         (
            jpeg,
            jpg,
            jpe
        );
        "public.mime-type" =         (
            "image/jpeg",
            "image/jpg"
        );
    };
}

从打印结果中可以看出,与UTTypeCopyDeclaration()文件扩展名关联的UTI类型的.109调用返回NULL,这意味着没有应用程序声明文件扩展名。将其与UTTypeCopyDeclaration()调用返回的结果进行比较,其中UTI类型与.jpg文件扩展名相关联。在那里,调用返回一个包含信息的有效字典,因为有一个应用程序(或系统本身)声明了文件扩展名。