【问题标题】:How to find file types in objective c如何在目标c中查找文件类型
【发布时间】:2011-07-09 23:38:26
【问题描述】:

我对此进行了大量研究,但没有发现任何有用的东西。我想在目标 c 中制作一个简单的程序供个人使用,它可以打开文件并提供有关它们的信息。我遇到的唯一问题是我找不到我正在打开的文件的文件。不简单查看扩展名,有没有办法在objective c中找到文件的完整文件格式?

如果可能,我还希望能够以不同的格式保存该文件。有关此主题的信息对于此应用程序也很重要。非常感谢您的帮助。

【问题讨论】:

    标签: objective-c file nsfilemanager


    【解决方案1】:

    现在(自 OS X 10.5 起)此信息通过 UTI 处理。

    你可以这样得到:

    NSURL *desktopURL = [[[NSFileManager defaultManager] URLsForDirectory: NSDesktopDirectory
                                                           inDomains: NSUserDomainMask] lastObject];
    
    NSURL *workingdirURL = [desktopURL URLByAppendingPathComponent:@"WorkingDir" isDirectory:YES];
    
    NSArray *docURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:workingdirURL 
                                                     includingPropertiesForKeys:@[NSURLTypeIdentifierKey] options:NSDirectoryEnumerationSkipsHiddenFiles 
                                                                          error: nil];
    
    NSMutableArray *pdfURLs = [NSMutableArray array];
    
    for (NSURL *docURL in docURLs) {
        id resourceValue;
        BOOL found = [docURL getResourceValue: &resourceValue
                                       forKey: NSURLTypeIdentifierKey
                                        error: nil];
    
        if ( found && [resourceValue isEqual:@"com.adobe.pdf"]) {
            [pdfURLs addObject: docURL];
        }
    }
    

    您可以查看docs 以获取有关可以通过这种方式检索的文件属性的更多信息。通过这种方法可以获得相当多的信息。

    【讨论】:

      【解决方案2】:

      Mac OS X 的每个文件都附加了类型信息,用于指定文件的类型。此信息由上次保存文件的应用程序提供,因此不一定正确。此外,新版本的 OS X 会忽略此信息并完全脱离文件扩展名。但是,信息仍然被存储,并且可以使用 NSFileManager 的attributesOfItemAtPath:error: 方法来检索。

      正如上面 quixoto 所提到的,OS X 现在将扩展映射到 UTI。可以使用 NSWorkspace 检索文件的 UTI,它还可以告诉您 UTI 的含义。此代码将在/full/path/to/file 处获取文件的本地化描述:

      NSWorkspace *ws = [NSWorkspace sharedWorkspace];
      NSString *description = [ws localizedDescriptionForType:[ws typeOfFile:@"/full/path/to/file" error:nil]];
      

      typeOfFile:error: 方法需要绝对路径。

      【讨论】:

        【解决方案3】:

        考虑一下:“完整文件格式”是什么意思?您关心什么类型的文件和详细程度?

        您无法真正从文件系统中获得您想要的“格式”信息。信不信由你,文件系统不知道文件是什么格式的。

        文件系统传统上将文件存储为具有名称、大小和其他一些属性(“隐藏”、权限等)的字节流。这就是它的全部责任,读取这些字节并将它们解释为有用的东西是应用程序的问题。

        扩展是应用程序关于文件包含什么的传统提示,但正如您可能猜到的那样,它肯定不是经过验证的保证。

        现代 Mac OS X 具有 Quick Look,它使用一个系统范围的框架,在此基础上添加了一些智能,扩展名和 UTIs 之间的映射,这是一个更丰富的文件类型概念。 Docs are here。我认为没有办法查询此系统以获取扩展和 UTI 之间的映射,但我不确定。

        加载一种格式的文件并保存为另一种格式 100% 取决于您所讨论的文件类型,如果您真的想完成此操作,您将会提出关于特定格式的非常具体的问题。 (而且该主题很好超出了 Cocoa 中的几个内置方法调用。)

        【讨论】:

        • “完整文件格式”是指文件格式的名称。例如,“rtf”将是“富文本文件”。我想我将不得不走很长的路。无论如何,谢谢。
        • 文件系统不知道文件是什么格式 ...HFS确实有Type Code,但我想它已经不再使用了。
        • @Justin:见@ughoavgfhw 的回答。使用 NSWorkspace 来获取文本描述——这是最接近你全面了解的。
        • @dreamlax:是的,我知道,但是类型代码在十年前就开始萎缩了。看起来 UTI 可以用 NSWorkspace 进行合理的翻译。
        猜你喜欢
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        相关资源
        最近更新 更多