ios - 更新文件大小时,不会调用监视目录更改的 DispatchSource

标签 ios swift filesystems

我写了一个 UITableViewController 的子类,它列出了一组目录中的文件及其各自的大小。当这些目录中有任何更改时,它也会自行更新。该类使用 DispatchSource 来“监视”目录。这是执行此操作的代码:

    for dir in directories {
        let fd = dir.withUnsafeFileSystemRepresentation { (filenamePointer) -> Int32 in
            // vfw_open is a wrapper function for open()
            return vfw_open(filenamePointer, O_EVTONLY)
        }

        guard fd != 0 else {
            return
        }

        let watcher = DispatchSource.makeFileSystemObjectSource(fileDescriptor: fd,
                                                                 eventMask: DispatchSource.FileSystemEvent.write,
                                                                 queue: DispatchQueue.global(qos: .utility))

        watcher.setEventHandler { [weak self] in
            DispatchQueue.main.async {
                self?.updateFileList()
            }
        }

        watcher.setCancelHandler() {
            close(fd)
        }

        watcher.resume()
    }

这段代码基本上为每个目录添加一个观察器,并在观察到变化时调用updateFileList。它运行完美,我的文件列表几乎可以立即更新任何更改。问题是,当我将一个大文件复制到一个目录时,updateFileList 会立即被调用。因此,我的 Controller 将新文件的大小显示为 0 字节。但是在文件被完全复制后,updateFileList 不会被调用,因此文件的实际大小不会更新。如何获取要更新的文件大小?

最佳答案

当您向目录添加观察者时,您正在观察目录本身,而不是目录中的文件。目录只是文件列表。当该列表发生变化(创建、删除或移入或移出文件)时,目录会发生变化,并且会调用您的观察者。对文件内容的更改不会修改目录。

要监视文件的更改,您必须为该文件添加一个监视程序。

关于ios - 更新文件大小时,不会调用监视目录更改的 DispatchSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44800015/

相关文章:

java - 如何通过java访问与我正在使用的服务器不同的服务器上的目录?

swift - 如何按在快速加载数据后计算的距离对表格 View 单元格进行排序

ios - dispatch_after 在内存中持久化 View Controller

ios - 只有实例方法可以声明@IBAction

java - SuperFloppyFormatter 对于超过 512 MB 的任何内容都会返回 FAT32?

filesystems - Reed Solomon 删除编码和复制因子

执行 Swift 库时 iOS 崩溃

ios - 滚动时如何向 UITableViewCell 添加更多按钮?

ios - 从Instagram获取照片

ios - 用于云 Firestore 数据库触发器的 Stripe Connect 重定向 uri