If I have a file, I can get the icon by doing something such as:
NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile: @\"myFile.png\"];
Underneath -[NSWorkspace iconForFile:]
in the documentation is -[NSWorkspace iconForFileType:]. Have you tried that?
You can first determine file type (UTI) and then pass it on to get icon:
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];
Here is the Swift 5 version of Dave DeLong's answer:
icon(forFile:)
Returns an image containing the icon for the specified file.
Declaration
func icon(forFile fullPath: String) -> NSImage
Parameters
fullPath
- The full path to the file.
icon(forFileType:)
Returns an image containing the icon for files of the specified type.
Declaration
func icon(forFileType fileType: String) -> NSImage
Parameters
fileType
- The file type, which may be either a filename extension, an encoded HFS file type, or a universal type identifier (UTI).
Here is the Swift 5 version of PetrV's answer:
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)
}
}