forked from github/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileSaveWatcher.swift
More file actions
39 lines (32 loc) · 881 Bytes
/
FileSaveWatcher.swift
File metadata and controls
39 lines (32 loc) · 881 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import Foundation
final class FileSaveWatcher {
let url: URL
var fileHandle: FileHandle?
var source: DispatchSourceFileSystemObject?
var changeHandler: () -> Void = {}
init(fileURL: URL) {
url = fileURL
startup()
}
deinit {
source?.cancel()
}
func startup() {
if let source = source {
source.cancel()
}
fileHandle = try? FileHandle(forReadingFrom: url)
if let fileHandle = fileHandle {
source = DispatchSource.makeFileSystemObjectSource(
fileDescriptor: fileHandle.fileDescriptor,
eventMask: .link,
queue: .main
)
source?.setEventHandler { [weak self] in
self?.changeHandler()
self?.startup()
}
source?.resume()
}
}
}