18

我正在编写一个小型 macOS 应用程序,我希望能够在其中查看文件夹的更改。它不需要监视子文件夹,我只想在将文件添加到文件夹或删除文件时收到通知。

它看起来NSFileCoordinator和/或NSFilePresenter可以用来实现这一点,但我无法理解如何使用它们来实现这一点。

理想情况下,无需包含第三方框架即可解决此问题。

4

2 回答 2

19

你可以使用 NSFilePresenter 来做到这一点。观察类必须符合如下所示的 NSFilePresenter。

presentItemURL 将指向您要观察的文件夹。如果显示的文件夹发生更改,则调用SubitemDidChangeAtURL。下面截取的代码可以让您了解它是如何工作的。

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 
                }
            }
        }
    }
}

最好的祝愿。

于 2018-05-21T07:16:24.343 回答
7

Marc T 的答案仍然有效,似乎是最简单的解决方案。

为了使它工作,我需要添加以下行(可能在 ObservingClass 的 init() 中):

NSFileCoordinator.addFilePresenter(self)
于 2020-05-04T21:07:10.750 回答