Files
markbase/docs/FSKIT_QUICK_REFERENCE.md
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

4.7 KiB
Raw Blame History

FSKit API Quick Reference

修正后的 API基于 FSKitSample

1. Entry Point

struct MyFSExtension: FSKitExtension {
    func filesystem() -> FSFileSystem {
        return MyFS()
    }
}

2. Filesystem

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

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

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

func pathconf(_ item: FSItem, conf: FSPathConf) throws -> Int32

OpenCloseOperations

func open(_ item: FSItem, options: FSTaskOptions) throws -> FSFileHandle
func close(_ handle: FSFileHandle) throws

IOOperations

func read(_ handle: FSFileHandle, buffer: UnsafeMutableRawBufferPointer, options: FSTaskOptions) throws -> Int
func write(_ handle: FSFileHandle, buffer: UnsafeRawBufferPointer, options: FSTaskOptions) throws -> Int

DirectoryOperations

func enumerateDirectory(_ item: FSItem, verifier: inout FSItemVerifier, options: FSTaskOptions) throws -> FSItemEnumerator

AttributeOperations

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

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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>FSExtension</key>
    <dict>
        <key>FSExtensionPersonality</key>
        <string>HelloFS</string>
        
        <key>FSShortName</key>
        <string>HelloFS</string>
        
        <key>FSObjectsAreCaseSensitive</key>
        <false/>
        
        <key>FSSupportsBlockDevices</key>
        <true/>
        
        <key>FSPrimaryClass</key>
        <string>HelloFS</string>
    </dict>
    
    <key>NSExtension</key>
    <dict>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.fskit</string>
        
        <key>NSExtensionPrincipalClass</key>
        <string>$(PRODUCT_MODULE_NAME).HelloFSExtension</string>
    </dict>
</dict>
</plist>

Entitlements Template

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
</dict>
</plist>

Testing Commands

Create block device

mkfile -n 100m dummy
hdiutil attach -imagekey diskimage-class=CRawDiskImage -nomount dummy
# Output: disk18 (or diskN)

Mount

mkdir /tmp/TestVol
mount -t HelloFS disk18 /tmp/TestVol

Unmount

umount /tmp/TestVol