/** * Tae Won Ha - http://taewon.de - @hataewon * See LICENSE */ import Cocoa fileprivate let workspace = NSWorkspace.shared() fileprivate let iconsCache = NSCache() class FileUtils { fileprivate static let keysToGet: [URLResourceKey] = [ .isDirectoryKey, .isHiddenKey, .isAliasFileKey, .isSymbolicLinkKey ] fileprivate static let scanOptions: FileManager.DirectoryEnumerationOptions = [ .skipsSubdirectoryDescendants, .skipsPackageDescendants ] fileprivate static let fileManager = FileManager.default static let userHomeUrl = URL(fileURLWithPath: NSHomeDirectory(), isDirectory: true) static func directDescendants(of url: URL) -> [URL] { guard let childUrls = try? self.fileManager.contentsOfDirectory( at: url, includingPropertiesForKeys: self.keysToGet, options: self.scanOptions ) else { // FIXME error handling return [] } return childUrls } static func fileExists(at url: URL) -> Bool { guard url.isFileURL else { return false } let path = url.path return self.fileManager.fileExists(atPath: path) } static func commonParent(of urls: [URL]) -> URL { guard urls.count > 0 else { return URL(fileURLWithPath: "/", isDirectory: true) } let pathComps = urls.map { $0.deletingLastPathComponent().pathComponents } let min = pathComps.map { $0.count }.min()! let pathCompsOnlyMin = pathComps.map { $0[0.. 1 { return idx - 1 } else { return result } } let result = pathCompsOnlyMin[0] let possibleParent = NSURL.fileURL(withPathComponents: Array(result[0...commonIdx]))! return possibleParent.isDir ? possibleParent : possibleParent.parent } static func icon(forType type: String) -> NSImage { return workspace.icon(forFileType: type) } static func icon(forUrl url: URL) -> NSImage? { if let cached = iconsCache.object(forKey: url as NSURL) { return cached } let path = url.path let icon = workspace.icon(forFile: path) icon.size = CGSize(width: 16, height: 16) iconsCache.setObject(icon, forKey: url as NSURL) return icon } }