# FSKit API Quick Reference ⭐⭐⭐⭐⭐ ## 修正后的 API(基于 FSKitSample) ### 1. Entry Point ```swift struct MyFSExtension: FSKitExtension { func filesystem() -> FSFileSystem { return MyFS() } } ``` ### 2. Filesystem ```swift class MyFS: FSFileSystem { func probeResource( resource: FSResource, replyHandler: @escaping (FSProbeResult?) -> Void ) { // Check if resource is usable let result = FSProbeResult.usable( resource: resource, identifier: FSResourceIdentifier(uuid: UUID()), userInfo: nil ) replyHandler(result) } func loadResource( resource: FSResource, options: FSTaskOptions, replyHandler: @escaping (Error?) -> Void ) { // Load resource (block device, etc) replyHandler(nil) } func unloadResource( resource: FSResource, options: FSTaskOptions, replyHandler: @escaping (Error?) -> Void ) { // Unload resource replyHandler(nil) } } ``` ### 3. Volume ```swift class MyFSVolume: FSVolume { init(resource: FSResource) { super.init(resource: resource) } } // Required protocols (13+): extension MyFSVolume: FSVolume.PathConfOperations { } extension MyFSVolume: FSVolume.OpenCloseOperations { } extension MyFSVolume: FSVolume.IOOperations { } extension MyFSVolume: FSVolume.DirectoryOperations { } extension MyFSVolume: FSVolume.AttributeOperations { } extension MyFSVolume: FSVolume.XattrOperations { } ``` ### 4. File Item ```swift class MyFSItem: FSItem { var name: FSFileName var id: UInt64 var attributes: FSItem.Attributes var xattrs: [String: Data] var children: [MyFSItem] var content: Data? init(name: FSFileName) { self.name = name self.id = UInt64.random() self.attributes = FSItem.Attributes() super.init() } } ``` ### 5. Key Protocol Methods **PathConfOperations**: ```swift func pathconf(_ item: FSItem, conf: FSPathConf) throws -> Int32 ``` **OpenCloseOperations**: ```swift func open(_ item: FSItem, options: FSTaskOptions) throws -> FSFileHandle func close(_ handle: FSFileHandle) throws ``` **IOOperations**: ```swift func read(_ handle: FSFileHandle, buffer: UnsafeMutableRawBufferPointer, options: FSTaskOptions) throws -> Int func write(_ handle: FSFileHandle, buffer: UnsafeRawBufferPointer, options: FSTaskOptions) throws -> Int ``` **DirectoryOperations**: ```swift func enumerateDirectory(_ item: FSItem, verifier: inout FSItemVerifier, options: FSTaskOptions) throws -> FSItemEnumerator ``` **AttributeOperations**: ```swift func attributes(_ item: FSItem) throws -> FSItem.Attributes func attributes(_ item: FSItem, named: FSFileName) throws -> FSItem.Attributes func setAttributes(_ item: FSItem, attributes: FSItem.Attributes, options: FSTaskOptions) throws ``` **XattrOperations**: ```swift func getXattr(_ item: FSItem, name: String) throws -> Data func setXattr(_ item: FSItem, name: String, value: Data, options: FSTaskOptions) throws func listXattrs(_ item: FSItem) throws -> [String] func removeXattr(_ item: FSItem, name: String, options: FSTaskOptions) throws ``` --- ## Info.plist Template ```xml FSExtension FSExtensionPersonality HelloFS FSShortName HelloFS FSObjectsAreCaseSensitive FSSupportsBlockDevices FSPrimaryClass HelloFS NSExtension NSExtensionPointIdentifier com.apple.fskit NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).HelloFSExtension ``` --- ## Entitlements Template ```xml com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write ``` --- ## Testing Commands **Create block device**: ```bash mkfile -n 100m dummy hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount dummy # Output: disk18 (or diskN) ``` **Mount**: ```bash mkdir /tmp/TestVol mount -t HelloFS disk18 /tmp/TestVol ``` **Unmount**: ```bash umount /tmp/TestVol ``` ---