Swift / Cocoa:如何观察文件夹的变化?

eiv*_*dml 7 macos cocoa nsfilecoordinator nsfilepresenter swift

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

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

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

Mar*_* T. 8

您可以使用NSFilePresenter进行此操作。观察类必须符合NSFilePresenter,如下所示。

presentItemURL将指向您要观察的文件夹。如果文件夹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 
                }

            }
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

最好的祝愿。

  • 我对 NSFilePresenter 进行了大量实验,并获得了从未调用过presentSubitemDidAppear(at:) 的相同体验。也许它与 Apple 对 Finder 所做的 NSFileCoordinator 实现有关。还要注意,在某些情况下,presentSubitemDidChangeAtURL 会被多次调用(例如复制包、文件重命名等)。 (2认同)

小智 8

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

为了使其工作,我需要添加以下行(可能位于 ObservingClass 的 init() 处):

NSFileCoordinator.addFilePresenter(self)
Run Code Online (Sandbox Code Playgroud)