核心功能: - ✅ 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)
4.7 KiB
4.7 KiB
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