ディレクトリのグループ内のファイルをそれぞれのサイズとともに一覧表示する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
と、すぐに呼び出されることです。そのため、私のコントローラーは新しいファイルのサイズを0バイトとして表示します。ただし、ファイルが完全にコピーされた後updateFileList
は呼び出されないため、ファイルの実際のサイズは更新されません。更新するファイルサイズを取得するにはどうすればよいですか?
ウォッチャーをディレクトリに追加すると、ディレクトリ内のファイルではなく、ディレクトリ自体が監視されます。ディレクトリは単なるファイルのリストです。そのリストが変更されると(ファイルが作成、削除、または移動されたり、移動されたりすると)、ディレクトリが変更され、ウォッチャーが呼び出されます。ファイルの内容を変更しても、ディレクトリは変更されません。
ファイルへの変更を監視するには、ファイルのウォッチャーを追加する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加