2014-03-24 83 views
1

我试图使用[string pathExtension]来获取文件扩展名,但这并不总是返回文件扩展名本身。例如:我有一个名为'Example.png'的文件,当我使用这个方法时,我得到'png',这是正确的。现在让我们说我有一个没有扩展名的文件,比如'Example',我得到了nil这仍然是正确的。当我有像'Example.109'这样的文件时会发生什么?我得到'109'作为不正确的扩展名。恰巧'.109'是文件名本身的一部分。有没有办法验证这一点?检查文件扩展名是否有效

+0

那它取决于你的意思是有效的?文件名格式不是由扩展名决定的,而是由文件本身的格式决定的,如果你告诉更多关于它们是什么文件的信息,我们可以帮助你知道如何验证文件 –

+0

在我的情况下,文件根本不重要。我只关心得到适当的延伸。所以一个有效的扩展将是不正确的派生出来的,就像在这个案例中那样。 – Shwethascar

+5

109是一个有效的扩展名,但它只对你无效。您需要手动验证它。 – Merlevede

回答

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()对于与.109文件扩展名关联的UTI类型返回NULL,这意味着没有声明文件扩展名的应用程序。将其与使用与.jpg文件扩展名关联的UTI类型的UTTypeCopyDeclaration()调用返回的结果进行比较。在那里,调用返回一个包含信息的有效字典,因为有一个应用程序(或系统本身)声明了文件扩展名。

相关问题