我写了一个 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/