// // AppDelegate.swift // parallel_file_access_test // // Created by Kevin Elliott on 10/6/25. // import Cocoa @main class AppDelegate: NSObject, NSApplicationDelegate { // Create a background queue for the system to use // when invoking each file coordinator's accessor // closure. let queue = OperationQueue() let date = Date() var count:UInt64 = 0 var objectCount:UInt64 = 0 func enumerateDirectorySync(at url: URL) { let fileManager = FileManager.default guard let enumerator = fileManager.enumerator(at: url, includingPropertiesForKeys: [.isDirectoryKey], options: [], errorHandler: { (url, error) -> Bool in print("Error enumerating \(url): \(error)") return false // Continue enumeration }) else { print("Failed to create enumerator for URL: \(url.path)") return } // print("Enumerating directory:\(url.lastPathComponent)") for case let fileURL as URL in enumerator { do { self.objectCount += 1 if(self.objectCount>100000) { let timePass = Date().timeIntervalSince(self.date) print("Time: \(timePass), width \(self.queue.maxConcurrentOperationCount) count: \(self.objectCount)") exit(1); } let resourceValues = try fileURL.resourceValues(forKeys: [.isDirectoryKey]) if resourceValues.isDirectory == true { // print(" [DIR] \(url.lastPathComponent)/\(fileURL.lastPathComponent)") self.scanDirectorySync(inDir: fileURL) } else { //print("[FILE] \(fileURL.path)") } } catch { print("Could not get resource values for \(fileURL.path): \(error)") } } // print(" Complete directory: \(url.lastPathComponent)") } func scanDirectorySync( inDir: URL) { // Iterate over the file URLs. // Create a file coordinator and specify the appropriate // file access intent and queue. self.queue.addOperation { self.count+=1 print("\(self.count) scanDirectory: \(inDir.lastPathComponent)") if(self.count>10000) { let timePass = Date().timeIntervalSince(self.date) print("Time: \(timePass), width \(self.queue.maxConcurrentOperationCount) scanCount: \(self.count) objectCount: \(self.objectCount)") exit(1); } NSFileCoordinator().coordinate(readingItemAt: inDir, options: NSFileCoordinator.ReadingOptions.immediatelyAvailableMetadataOnly, error: NSErrorPointer.none) { inURL in self.enumerateDirectorySync(at: inURL) } } } func applicationDidFinishLaunching(_ aNotification: Notification) { queue.underlyingQueue = .global(qos: .utility) queue.maxConcurrentOperationCount = 4 #warning("Change Target Path Here") let url = URL(fileURLWithPath: "/Volumes/HomeBase/MassiveTestBed") //self.scanDirectory(inDir: url) self.scanDirectorySync(inDir: url) // Insert code here to initialize your application } func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application } func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { return true } }