文件类型的Cocoa图标?

时间:2011-09-21 23:28:34

标签: objective-c cocoa

如果我有一个文件,我可以通过执行以下操作来获取图标:

NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile: @"myFile.png"];

但是,如果我只是想获取特定文件类型的图标(例如与png文件关联的图标,而没有已经存在的“myFile.png”),我不确定我该怎么做。

任何建议都表示赞赏!

4 个答案:

答案 0 :(得分:26)

文档中的-[NSWorkspace iconForFile:]下面是-[NSWorkspace iconForFileType:]。你试过了吗?

答案 1 :(得分:3)

您可以先确定文件类型(UTI),然后将其传递给获取图标:

NSString *fileName = @"lemur.jpg"; // generic path to some file
CFStringRef fileExtension = (__bridge CFStringRef)[fileName pathExtension];
CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

NSImage *image = [[NSWorkspace sharedWorkspace]iconForFileType:(__bridge NSString *)fileUTI];

答案 2 :(得分:1)

这是Dave DeLong's answer Swift 5 版本:

  

icon(forFile:)

     

返回包含指定文件图标的图像。

     

声明

func icon(forFile fullPath: String) -> NSImage
     

参数

     
    
fullPath
      
文件的完整路径。
  
  

icon(forFileType:)

     

返回包含指定类型文件图标的图像。

     

声明

func icon(forFileType fileType: String) -> NSImage
     

参数

     
    
fileType
      
文件类型,可以是文件扩展名,编码的HFS文件类型或通用类型标识符(UTI)。
  

答案 3 :(得分:0)

这是PetrV's answer Swift 5 版本:

public extension NSWorkspace {

    /// Returns an image containing the icon for files of the same type as the file at the specified path.
    ///
    /// - Parameter filePath: The full path to the file.
    /// - Returns: The icon associated with files of the same type as the file at the given path.
    func icon(forFileTypeAtSamplePath filePath: String) -> NSImage? {
        let fileExtension = URL(fileURLWithPath: filePath).pathExtension
        guard
            let unmanagedFileUti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
                                                                         fileExtension as CFString, nil),
            let fileUti = unmanagedFileUti.takeRetainedValue() as String?
            else {
                assertionFailure("Should've gotten a UTI for \(fileExtension)")
                return nil
        }

        return NSWorkspace.shared.icon(forFileType: fileUti)
    }
}