我试图使用[string pathExtension]
获取文件扩展名,但这并不总是返回文件扩展名本身。例如:我有一个名为' Example.png'的文件,当我使用这种方法时,我得到了' png'哪个是对的。现在让我们说我有一个没有扩展名的文件,例如'示例',我得到的nil
仍然是正确的。当我有一个类似于' Example.109'的文件时会发生什么?我得到了109'作为不正确的扩展名。它恰好发生在' .109'是文件名本身的一部分。有没有办法验证这个?
答案 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
文件扩展名相关联。在那里,调用返回一个包含信息的有效字典,因为有一个应用程序(或系统本身)声明了文件扩展名。