SwiftFileSystemEvents

GitHub

File System Events API 的一个精简 Swift 封装。

SwiftFileSystemEvents 的文档采用 DocC 格式。

概述

File System Events API 提供了在目录粒度级别接收文件系统事件通知的能力。该 API 允许限制为监听来自连接到文件系统的特定设备(设备级别)的事件,或者监听来自所有设备(主机级别)的事件。

SwiftFileSystemEvents 是 File System Events API 的 Swift 封装,用于在主机级别工作。 它是一个精简的封装,因为 SwiftFileSystemEvents 的类型和方法通常以一对一的方式映射到 File System Events 的类型和函数。 因此,如果您知道如何使用 File System Events API,那么您应该可以轻松地采用 SwiftFileSystemEvents。 此外,您可以使用 File System Events 做任何事情,您也应该能够使用 SwiftFileSystemEvents 来做,只要它与在主机级别工作有关。 SwiftFileSystemEvents 的主要作用是处理 Swift 和 C 之间各种指针操作和类型转换,这是从 Swift 使用 File System Events 所必需的。

File System Events API 的机制有些复杂,因此我建议您在使用 SwiftFileSystemEvents 之前阅读 File System Events Programming Guide。 至少阅读“Technology Overview”部分并略读“Using the File System Events API section”。 可以通过访问 Appleʼs Documentation Archive 并搜索 “File System Events Programming Guide” 来找到该编程指南。

用法

要注册文件系统事件的通知,您需要创建 FileSystemEventStream 的一个实例。 然后,您使用 setDispatchQueue(_:) 将流调度到 dispatch queue 上,并使用 start() 启动流。 一旦您不再希望监听事件,您可以使用 stop() 停止流。 在流停止时,您可以使用 setDispatchQueue(_:) 将其调度到不同的队列,或者通过将 nil 传递给 setDispatchQueue(_:) 将其从现有队列中取消调度。 完成流后,您可以通过调用 invalidate() 使其失效。

下面的代码展示了上述的使用模式。

let url = URL(filePath: "/path/to/directory/to/watch")
let handler: (FileSystemEvent) -> Void = { event in
    print(event)
}
let queue: DispatchQueue = .global(qos: .background)
let stream = FileSystemEventStream(directoriesToWatch: [url], handler: handler)
stream.setDispatchQueue(queue)
stream.start()
// Now `handler` will be called on each event that occurs.
stream.stop()
stream.invalidate()

警告:如果您已将流调度到队列上,则必须在释放该流之前使其失效。 只有当前调度到队列中的流才能失效。 因此,在失效流之前立即取消调度流是错误的。