Swift 4 macOS App - 如何找到重要的用户目录?

Posted

技术标签:

【中文标题】Swift 4 macOS App - 如何找到重要的用户目录?【英文标题】:Swift 4 macOS App - How to find the important users directories? 【发布时间】:2018-04-10 09:41:30 【问题描述】:

使用 Swift 4 让 macOS 应用程序找到重要的用户目录(例如:桌面、文档、下载等)最简单的方法是什么?

【问题讨论】:

【参考方案1】:

TLDR:

let desktopDir = try? FileManager.default.url(for: .desktopDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let documentDir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let downloadsDir = try? FileManager.default.url(for: .downloadsDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

有两种方法可以获取此信息,均来自FileManager 类:

这个:

func urls(for directory: FileManager.SearchPathDirectory, 
   in domainMask: FileManager.SearchPathDomainMask) -> [URL]

返回请求域中指定公共目录的 URL 数组。 […] 目录按照域掩码常量的顺序排列,用户域中的项目在前,系统域中的项目在后。

文档:https://developer.apple.com/documentation/foundation/filemanager/1407726-urls

(已经在@leo-dabus 的回答中提到)

还有这个:

(我更喜欢它,因为它更通用并返回单个 URL)

func url(for directory: FileManager.SearchPathDirectory, 
  in domain: FileManager.SearchPathDomainMask, 
  appropriateFor url: URL?, 
  create shouldCreate: Bool) throws -> URL

在域中查找并选择性地创建指定的公共目录。

文档:https://developer.apple.com/documentation/foundation/filemanager/1407693-url

对于任何一个:

https://developer.apple.com/documentation/foundation/filemanager.searchpathdomainmask 中定义的有效域是:

.userDomainMask:用户的主目录——安装用户个人物品的地方(~)。

.localDomainMask: 本地 当前机器——安装每个人都可以使用的项目的地方 这台机器。

.networkDomainMask:在 局域网——安装网络上可用项目的地方 (/网络)。

.systemDomainMask:Apple 提供——无法修改(/System)。

.allDomainsMask:所有域。

directory 参数有很多可能性,在https://developer.apple.com/documentation/foundation/filemanager.searchpathdirectory 中定义:

.applicationDirectory:支持的应用程序(/Applications)。

.demoApplicationDirectory: 不支持的应用程序和演示 版本。

.developerApplicationDirectory: 开发者应用 (/开发人员/应用程序)。

.adminApplicationDirectory系统和 网络管理应用程序。

.libraryDirectory: 各种 用户可见的文档、支持和配置文件 (/图书馆)。

.developerDirectory:开发者资源(/Developer)。

.userDirectory:用户主目录 (/Users)。

.documentationDirectory:文档。

.documentDirectory:文档目录。

.coreServiceDirectory: 核心服务位置 (系统/库/核心服务)。

.autosavedInformationDirectory: 用户自动保存文档的位置(库/自动保存信息)。

.desktopDirectory: 用户桌面目录的位置。

.cachesDirectory:可丢弃缓存文件的位置(库/缓存)。

.applicationSupportDirectory: 应用程序支持文件的位置 (库/应用程序支持)。

.downloadsDirectory: 位置 用户的下载目录。

.inputMethodsDirectory: 位置 输入法(库/输入法)。

.moviesDirectory: 位置 用户的电影目录 (~/Movies)。

.musicDirectory: 位置 用户的音乐目录 (~/Music)。

.picturesDirectory: 位置 用户的图片目录 (~/Pictures)。

.printerDescriptionDirectory: 系统 PPDs 目录的位置 (库/打印机/PPD)。

.sharedPublicDirectory: 用户的位置 公共共享目录 (~/Public)。

.preferencePanesDirectory: 用于 System 的 PreferencePanes 目录的位置 首选项(库/PreferencePanes)。

.applicationScriptsDirectory: 调用应用程序的用户脚本文件夹的位置 (~/Library/Application Scripts/),

.itemReplacementDirectory: 传递给 FileManager 方法 url(for:in:appropriateFor:create:) 为了创建一个临时 目录。

.allApplicationsDirectory: 所有目录 可能会出现应用程序。

.allLibrariesDirectory: 所有目录 哪里有资源。

.trashDirectory: 垃圾箱的位置 目录。

【讨论】:

非常感谢!【参考方案2】:

你可以使用 FileManager urls 方法

func urls(for directory: FileManager.SearchPathDirectory, in domainMask: FileManager.SearchPathDomainMask) -> [URL]

并传递FileManager.SearchPathDirectory .desktopDirectory.documentDirectory.downloadsDirectory 作为用户域掩码并获取返回的第一个url:

let desktopDirectory  = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let downloadsDirectory = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first!

【讨论】:

为什么这会返回 .documentDirectory 路径 file:///Users/username/Library/Containers/... 而不是路径 file:///Users/username/Documents/ ? Dawy,我也有这个。您很可能需要授予您的应用访问下载、电影等的权限。那里有Capabilities 选项卡和File Access 区域。查看那里的选项。 我现在正在努力解决这个问题 - 这是一个新问题,我之前已经在 Catalina 上成功构建过。目前,我的 Capabilities“文件访问”部分没有提到任何关于 Documents 的内容,并且我无法获取用户的主目录 Documents。非常令人沮丧。 啊哈!知道了。我不小心在我的应用程序的权利中打开了沙盒。 默认情况下,MacOS 应用程序是沙盒化的,这意味着除非用户明确访问,否则无法直接访问 Documents 文件夹。因此,如果您收到这种可爱类型的文档 URL:file:///Users/bioche/Library/Containers/com.bioche.UIApp/Data/Documents/pointFree/report.txt,请检查权利文件中的 App Sandbox 属性是否设置为 NO

以上是关于Swift 4 macOS App - 如何找到重要的用户目录?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode Swift MacOS App,将文件拖放到 NSTextField

iPad 上的 Swift Playgrounds,NSLog 在 macOS 上的“Console.app”上不显示任何消息

使用Swift开发一个MacOS的菜单状态栏App

如何在 macOS 中更新 lldb

MacOS的菜单状态栏App添加饼型进度

如何从 CLI 快速重命名 macOS 或 linux 上的文件?