在Swift中,可以通过URL.documentsDirectory访问文档目录,此处之外,还有其他的URL快捷访问方法。
这些属性和方法是 Swift 的 URL 类型提供的快捷访问方法(从 macOS 13.0 和 iOS 16.0 开始引入),用于获取常用的系统目录。它们为常用的用户文件夹(如文档、桌面、缓存等)提供了方便的访问方式,而不需要通过 FileManager 手动查找。
常见的 URL 快捷访问方法
currentDirectory():获取当前工作目录。
homeDirectory:获取当前用户的主目录(~)。
temporaryDirectory:获取当前用户的临时目录。
documentsDirectory:获取当前用户的文档目录(~/Documents)。
desktopDirectory:获取当前用户的桌面目录(~/Desktop)。
downloadsDirectory:获取当前用户的下载目录(~/Downloads)。
cachesDirectory:获取当前用户的缓存目录(~/Library/Caches)。
moviesDirectory、musicDirectory、picturesDirectory:分别对应视频、音乐、图片目录。
sharedPublicDirectory:获取用户的公共共享目录(~/Public)。
trashDirectory(macOS 专用):获取用户的垃圾桶目录(~/.Trash)。
自定义目录方法
homeDirectory(forUser:):获取指定用户的主目录。
init(for:in:appropriateFor:create:):根据 FileManager.SearchPathDirectory 和 SearchPathDomainMask 初始化 URL,允许自定义目录的选择和创建。
使用示例
这些 URL 快捷访问方法提供了便捷的方式来获取常用的目录 URL,而不必显式地通过 FileManager。在 Swift 中,系统目录路径可以直接通过这些 URL 类型的静态属性获取,而这些属性其实是基于 FileManager 封装的。
// 获取文档目录 URL
let documentsURL = URL.documentsDirectory
// 获取临时目录 URL
let tempURL = URL.temporaryDirectory
// 获取主目录 URL
let homeURL = URL.homeDirectory
// 获取桌面目录 URL
let desktopURL = URL.desktopDirectory
print("Documents Directory: \(documentsURL)")
print("Temporary Directory: \(tempURL)")
print("Home Directory: \(homeURL)")
print("Desktop Directory: \(desktopURL)")
if let text =
"""
Some name
""".data(using: .utf8) {
do {
try text.write(to: documentsURL.appending(path: "text.txt"))
} catch {
print("写入失败")
}
}
为什么不需要显式调用 FileManager?
这些快捷属性实际上是 URL 类型的静态属性,由 Swift 提供的 URL 访问 API 封装。它们在内部会通过系统 API 获取目录路径,简化了代码书写,不需要显式调用 FileManager 来查找目录。Swift 的 URL 访问属性在底层实际上依赖于 FileManager 来提供正确的系统路径,只不过这种封装让我们不必直接与 FileManager 交互,从而使代码更加简洁和易读。
与 FileManager 的关系
这些快捷访问属性与 FileManager 是有关系的。FileManager 提供了访问系统路径的基础功能,例如 urls(for:in:) 和 homeDirectoryForCurrentUser 等方法。这些 URL 的静态属性利用了 FileManager 的功能,但进一步抽象和简化了目录的查找和使用流程。因此,底层还是基于 FileManager 进行路径查找,只是 URL 提供了更方便的 API。
FileManager 对应方法
在旧版本的系统中(或没有快捷属性时),可以通过 FileManager 这样访问相同的路径:
let fileManager = FileManager.default
if let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
print("Documents Directory: \(documentsURL)")
}
新的 URL 静态属性相当于省去了 FileManager 的显式调用,简化了常用路径的获取流程。
Foundation框架URL扩展代码
extension URL {
public static func currentDirectory() -> URL
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var homeDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var temporaryDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var cachesDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var applicationDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var libraryDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var userDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var documentsDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var desktopDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var applicationSupportDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var downloadsDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var moviesDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var musicDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var picturesDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static var sharedPublicDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, *)
@available(tvOS, unavailable)
@available(watchOS, unavailable)
public static var trashDirectory: URL { get }
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public static func homeDirectory(forUser user: String) -> URL?
@available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
public init(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, appropriateFor url: URL? = nil, create shouldCreate: Bool = false) throws
}