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

don*_*ale 5 macos file-handling swift macos-sierra macos-high-sierra

对于MacOS应用程序,Swift 4最简单的方法是找到重要的用户目录,例如:桌面,文档,下载等?

Mat*_*ues 8

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)
Run Code Online (Sandbox Code Playgroud)

有两种方法可以从FileManager类中获取此信息:

这个:

func urls(for directory: FileManager.SearchPathDirectory, 
   in domainMask: FileManager.SearchPathDomainMask) -> [URL]
Run Code Online (Sandbox Code Playgroud)

返回所请求域中指定公用目录的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
Run Code Online (Sandbox Code Playgroud)

在域中找到并可选地创建指定的公共目录。

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

对于任何一个:

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

.userDomainMask:用户的主目录-安装用户个人物品(〜)的位置。

.localDomainMask:当前机器本地的-安装此机器上每个人都可用的项目的位置。

.networkDomainMask:局域网中公共可用的位置-安装网络(/ Network)上可用项目的位置。

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

.allDomainsMask:所有域。

directoryhttps://developer.apple.com/documentation/foundation/filemanager.searchpathdirectory中定义的参数有很多可能性:

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

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

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

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

.libraryDirectory:各种用户可见的文档,支持和配置文件(/库)。

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

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

.documentationDirectory:文档。

.documentDirectory:文档目录。

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

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

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

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

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

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

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

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

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

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

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

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

.preferencePanesDirectory:与系统偏好设置一起使用的PreferencePanes目录的位置(库/ PreferencePanes)。

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

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

.allApplicationsDirectory:所有可以出现应用程序的目录。

.allLibrariesDirectory:可能发生资源的所有目录。

.trashDirectory:回收站目录的位置。


Leo*_*bus 4

您可以使用 FileManager urls 方法

func urls(for directory: FileManager.SearchPathDirectory, in domainMask: FileManager.SearchPathDomainMask) -> [URL]
Run Code Online (Sandbox Code Playgroud)

并传递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!
Run Code Online (Sandbox Code Playgroud)

  • 为什么这会返回 .documentDirectory 路径 file:///Users/username/Library/Containers/... 而不是路径 file:///Users/username/Documents/ ? (5认同)
  • 达伊,我也有这个。您很可能需要授予您的应用程序访问下载、电影等的权限。那里有“功能”选项卡和“文件访问”区域。查看那里的选项。 (2认同)
  • 啊哈!知道了。我不小心以某种方式在我的应用程序的权利中打开了沙盒。 (2认同)