mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-16 05:21:22 +00:00
50 lines
1.6 KiB
Swift
50 lines
1.6 KiB
Swift
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// SPDX-FileCopyrightText: Copyright 2024 Pomelo, Stossy11
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import Foundation
|
|
|
|
class FolderMonitor {
|
|
private var folderDescriptor: Int32 = -1
|
|
private var folderMonitorSource: DispatchSourceFileSystemObject?
|
|
private let folderURL: URL
|
|
private let onFolderChange: () -> Void
|
|
init(folderURL: URL, onFolderChange: @escaping () -> Void) {
|
|
self.folderURL = folderURL
|
|
self.onFolderChange = onFolderChange
|
|
startMonitoring()
|
|
}
|
|
private func startMonitoring() {
|
|
folderDescriptor = open(folderURL.path, O_EVTONLY)
|
|
guard folderDescriptor != -1 else {
|
|
print("Failed to open folder descriptor.")
|
|
return
|
|
}
|
|
|
|
folderMonitorSource = DispatchSource.makeFileSystemObjectSource(
|
|
fileDescriptor: folderDescriptor,
|
|
eventMask: .write,
|
|
queue: DispatchQueue.global()
|
|
)
|
|
folderMonitorSource?.setEventHandler { [weak self] in
|
|
self?.folderDidChange()
|
|
}
|
|
folderMonitorSource?.setCancelHandler {
|
|
close(self.folderDescriptor)
|
|
}
|
|
folderMonitorSource?.resume()
|
|
}
|
|
|
|
private func folderDidChange() {
|
|
// Detect the change and call the refreshcore function
|
|
print("Folder changed! New file added or removed.")
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.onFolderChange()
|
|
}
|
|
}
|
|
deinit {
|
|
folderMonitorSource?.cancel()
|
|
}
|
|
}
|