Swift / Cocoa: 如何查看文件夹的变化?
Swift / Cocoa: How to watch folder for changes?
我正在编写一个小型 macOS 应用程序,我希望能够在其中查看文件夹的更改。它不需要监视子文件夹,我只想在文件添加到文件夹或删除时收到通知。
看起来 NSFileCoordinator
and/or NSFilePresenter
可以用来实现这一点,但我无法理解如何使用它们来实现这一点。
理想情况下,无需包含第三方框架即可解决此问题。
您可以使用 NSFilePresenter 执行此操作。
观察 class 必须符合如下所示的 NSFilePresenter。
presentedItemURL 将指向您要观察的文件夹。
如果文件夹 presentedSubitemDidChangeAtURL 发生变化,则调用。下面的代码片段可以让您了解它是如何工作的。
class ObservingClass: NSObject, NSFilePresenter {
lazy var presentedItemOperationQueue = NSOperationQueue.mainQueue()
var presentedItemURL:NSURL?
func presentedSubitemDidChangeAtURL(url: NSURL) {
let pathExtension = url.pathExtension
if pathExtension == "png"{
refreshImages()
}
}
func refreshImages(){
let path = snapshotPath
var isDirectory: ObjCBool = ObjCBool(false)
if NSFileManager.defaultManager().fileExistsAtPath(path!, isDirectory: &isDirectory){
if isDirectory{
do {
let list = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(path!) as Array<String>
for filePath in list {
if filePath.hasSuffix(".png"){
if let snapshot = snapshotAtPath(path! + "/" + filePath){
newSnapshotArray += [snapshot]
}
}
}
} catch {
// error handling
}
}
}
}
}
祝福。
Marc T 的答案仍然有效,而且似乎是最简单的解决方案。
为了让它工作,我需要添加以下行(可以在 ObservingClass 的 init() 处):
NSFileCoordinator.addFilePresenter(self)
我正在编写一个小型 macOS 应用程序,我希望能够在其中查看文件夹的更改。它不需要监视子文件夹,我只想在文件添加到文件夹或删除时收到通知。
看起来 NSFileCoordinator
and/or NSFilePresenter
可以用来实现这一点,但我无法理解如何使用它们来实现这一点。
理想情况下,无需包含第三方框架即可解决此问题。
您可以使用 NSFilePresenter 执行此操作。 观察 class 必须符合如下所示的 NSFilePresenter。
presentedItemURL 将指向您要观察的文件夹。 如果文件夹 presentedSubitemDidChangeAtURL 发生变化,则调用。下面的代码片段可以让您了解它是如何工作的。
class ObservingClass: NSObject, NSFilePresenter {
lazy var presentedItemOperationQueue = NSOperationQueue.mainQueue()
var presentedItemURL:NSURL?
func presentedSubitemDidChangeAtURL(url: NSURL) {
let pathExtension = url.pathExtension
if pathExtension == "png"{
refreshImages()
}
}
func refreshImages(){
let path = snapshotPath
var isDirectory: ObjCBool = ObjCBool(false)
if NSFileManager.defaultManager().fileExistsAtPath(path!, isDirectory: &isDirectory){
if isDirectory{
do {
let list = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(path!) as Array<String>
for filePath in list {
if filePath.hasSuffix(".png"){
if let snapshot = snapshotAtPath(path! + "/" + filePath){
newSnapshotArray += [snapshot]
}
}
}
} catch {
// error handling
}
}
}
}
}
祝福。
Marc T 的答案仍然有效,而且似乎是最简单的解决方案。
为了让它工作,我需要添加以下行(可以在 ObservingClass 的 init() 处):
NSFileCoordinator.addFilePresenter(self)