FileSystem
FileSystem 是一个简单、紧凑的面向协议的框架,用于在 iOS、tvOS、watchOS 和 macOS 上处理文件系统。
为了安全和一致性,所有基于 Item 的 API 都实现为可以抛出错误的函数。这主要是因为其他不受应用程序控制的外部进程可以在任何时间修改文件系统,加上 Swift 3 对可以抛出错误的属性没有概念。
类型
FileSystem 中主要的类型如下,其中协议被强调:
- 路径
- 路径表示
- 父级
- 子项
- 可复制
- 可复制子项
- 可移动
- 可移动子项
- 可重命名
- 可删除
- 可回收
- 可链接
- 符号链接
- 别名
- 文件句柄转换
- 文件包装转换
- 项目
- 文件
- 常规文件
- 符号链接
- 别名文件
- 目录
- 卷
路径
Path 用于表示磁盘上的位置,这意味着您不再需要在 String 和 URL 之间切换。
Path 可以通过一个 String 来表示为 RawRepresentable,因此可以使用默认构造函数进行初始化(如果 rawValue 无效,将返回 nil)
let path = Path(rawValue: "/")由于这种情况非常常见,可以省略 rawValue 参数标签
let path = Path("/")Path 采用 ExpressibleByStringLiteral,这意味着当类型可以被编译器推断时,可以完全省略初始化器
let path: Path = "/"如前所述,当前的 API 混合了 String 和 URL 表示形式,因此为了使事情更加简单,Path 也可以用文件 URL 进行初始化
let path = Path(url)Path 提供了各种 API 以访问其组件
public var components: [String]
public var lastComponent: String
public var componentsToDisplay: [String]?除了基于现有组件创建新的路径外
public func appendingComponent(_ component: String) -> Path
public func deletingLastComponent() -> Path
public func replacingLastComponent(with component: String) -> Path还有一个 API 可以访问路径的扩展名
public var `extension`: String有 API 可以解析和标准化一个 Path
public var resolved: Path
public var standardized: Path除了查看一个 Path 是否已经存在之外
public var exists: Bool要访问给定路径的 Item,可以使用项目属性
public var item: Item?PathRepresentable
PathRepresentable 可以被任何可以被 Path 表示的事物采用。
var path: Path { get }
init?(path: Path)初始化器应当返回 nil,如果 PathRepresentable 不存在或者不是正确的类型。
Item
Item 是所有可以由 Path 表示的文件系统项目的基 协议。 Item 采用 PathRepresentable,CustomStringConvertible 和 CustomDebugStringConvertible。
Item 增加了一个附加的初始化器,它不需要检查 Item 是否在给定的 Path 中存在,这对于 FileSystem 框架的效率内部使用(例如,当系统 API 返回有效的路径表示时)是必需的
init(_ path: Path)它还要求路径属性可以被设置
var path: Path { get set }Item 具有以下 API
public func exists() throws -> Bool
public func localizedName() throws -> String
public func isReadable() throws -> Bool
public func isWritable() throws -> Bool
public func isExecutable() throws -> Bool
public func isHidden() throws -> Bool
public func isPackage() throws -> Bool
public func isApplication() throws -> Bool
public func isAliasFile() throws -> Bool
public func isSymbolicLink() throws -> Bool
public func creationDate() throws -> Date
public func contentAccessDate() throws -> Date
public func contentModificationDate() throws -> Date
public func attributeModificationDate() throws -> Date
public func attributes() throws -> [FileAttributeKey: Any]
public func setAttributes(_ attributes: [FileAttributeKey: Any]) throwsParent
Parent 是一个可以为另一个 Item 作为父项的 协议。
Parent 协议提供访问其子项目的 API
func subitems() throws -> [Subitem]
func isEmpty() throws -> Bool
func contains(_ subitem: Subitem) throws -> Bool子项
子项 协议用于表示可以成为另一个项子项的项。
子项 协议提供了访问其根卷和父目录的API。
func rootVolume() throws -> Volume
func parentDirectory() throws -> Directory?可复制
可复制 协议用于表示可以复制的项。
func copy(to path: Path) throws -> Self可复制子项
可复制子项 协议用于表示采用了可复制和子项的项。
func copy(into parent: Parent) throws -> Self可移动
可移动 协议用于表示可以移动到另一个路径的项。
mutating func move(to path: Path) throws可移动子项
可移动子项 协议用于表示采用了可移动和子项的项。
mutating func move(into parent: Parent) throws可重命名
可重命名 协议用于表示可以进行重命名的项。
mutating func rename(to name: String) throws可删除
可重命名 协议 用于可以删除的 项,注意该项会立即被删除。
func remove() throws可回收利用的
可回收利用的 协议 用于可以被放入回收站的 项。
在 macOS 上,该 协议 具有以下 API
mutating func trash() throws可链接的
可链接的 协议 用于可以将 路径 硬链接到 项 上。
func link(to path: Path) throws -> Linkable符号链接可用的
符号链接可用的 协议 用于可以将 路径 符号链接到 项 上。
func symbolicLink(to path: Path) throws -> SymbolicLink可别名的
可别名的 协议 用于可以被别名的 项。
文件句柄可转换的
文件句柄可转换的 协议 用于可以将 项 转换为可供读取、写入或更新(读取和写入)的 文件句柄。
func fileHandleForReading() throws -> FileHandle
func fileHandleForWriting() throws -> FileHandle
func fileHandleForUpdating() throws -> FileHandle文件包装可转换的
文件包装可转换的 协议 用于可以将 项 转换为 文件包装。
func fileWrapper() throws -> FileWrapper文件
文件是单个文件的基协议,采用了项目、子项、可复制、可复制子项、可移动、可移动子项、可重命名、可删除、可回收站、可链接、符号链接和别名。
文件具有以下API
public func isContentEqual(to file: Self) -> Bool常规文件
常规文件是一个采用文件、文件句柄可转换和文件包装器可转换的结构,用于表示常规文件(即非符号链接或别名)。
常规文件具有以下API
public func size() throws -> Int符号链接
符号链接是一个采用文件和文件包装器可转换的结构,用于表示符号链接。
符号链接包含一个API来检索其目标
public func destination() throws -> SymbolicLinkable别名文件
别名文件是一个采用文件 协议的结构,用于表示别名文件。
别名文件包含一个API来检索其目标
public func destination() throws -> Aliasable目录
目录是一个采用项目、父项、子项、可复制、可复制子项、可移动、可移动子项、可重命名、可删除、可回收站、符号链接、别名和文件包装器可转换的结构。
目录具有访问系统目录的API
public static var temporary: Directory
public static var document: Directory
public static var library: Directory
public static var caches: Directory
public static var application: Directory
public static var applicationSupport: Directory
public static var desktop: Directory
public static var downloads: Directory
public static var movies: Directory
public static var music: Directory
public static var pictures: Directory
public static var applications: [Directory]
public static var libraries: [Directory]目录有一个API可以访问与另一个项目的关系
public func relationship(to item: Item) throws -> FileManager.URLRelationship除了在路径上创建目录的API外
static public func create(at path: Path, withIntermediateDirectories: Bool = false, attributes: [String : Any]? = nil) throws -> Directory还有一个API用于返回容器目录
public static func container(forSecurityApplicationGroupIdentifier groupIdentifier: String) -> Directory?卷
卷 是一个采用 Item、Parent、Renameable、Linkable 和 SymbolicLinkable 的 struct。
卷 提供了一个 API 用于访问所有挂载的卷
public static var mounted: [Volume]除了访问 卷 本身信息的 API
public func totalCapacity() throws -> Int
public func availableCapacity() throws -> Int
public func usedCapacity() throws -> Int
public func isEjectable() throws -> Bool
public func isRemovable() throws -> Bool
public func isInternal() throws -> Bool
public func isLocal() throws -> Bool
public func isReadOnly() throws -> Bool在 macOS 上您还可以卸载 卷
public func unmount(withOptions options: FileManager.UnmountOptions = [], completionHandler: @escaping (Error?) -> Void)