Files
markbase/docs/fskit-research/examples/HelloFS/Sources/HelloFS.swift
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

180 lines
4.6 KiB
Swift

// HelloFS - Final Correct Version
// Based on Apple FSKit v1 (macOS Sequoia 15+)
// CRITICAL: FSFileSystem is unavailable, use FSUnaryFileSystem
import Foundation
import FSKit
// MARK: - Entry Point (FSUnaryFileSystem)
// Note: FSKit v1 does NOT have separate Extension class
// FSUnaryFileSystem is the entry point directly
final class HelloFS: FSUnaryFileSystem {
required init() {
super.init()
print("HelloFS initialized")
}
func probeResource(
_ resource: FSResource,
replyHandler: @escaping (FSProbeResult?) -> Void
) {
print("HelloFS: Probing resource")
// Accept any block device
let result = FSProbeResult.usable(
resource: resource,
identifier: FSResourceIdentifier(uuid: UUID()),
userInfo: nil
)
replyHandler(result)
}
func loadResource(
_ resource: FSResource,
options: FSTaskOptions,
replyHandler: @escaping (Error?) -> Void
) {
print("HelloFS: Loading resource: \(resource)")
// For HelloFS, just return success
replyHandler(nil)
}
func unloadResource(
_ resource: FSResource,
options: FSTaskOptions,
replyHandler: @escaping (Error?) -> Void
) {
print("HelloFS: Unloading resource")
replyHandler(nil)
}
}
// MARK: - Volume (FSVolume with protocols)
final class HelloVolume: FSVolume {
var rootItem: HelloItem
var items: [String: HelloItem] = [:]
init(resource: FSResource) {
rootItem = HelloItem(name: "/", type: .directory)
super.init(resource: resource)
// Add sample file
let helloFile = HelloItem(name: "hello.txt", type: .file)
helloFile.content = "Hello from HelloFS!\n".data(using: .utf8)
items["hello.txt"] = helloFile
print("HelloVolume initialized")
}
}
// MARK: - Basic Volume Operations
extension HelloVolume: FSVolume.PathConfOperations {
func pathconf(_ item: FSItem, conf: FSPathConf) throws -> Int32 {
return 255 // Basic value
}
}
extension HelloVolume: FSVolume.OpenCloseOperations {
func open(_ item: FSItem, options: FSTaskOptions) throws -> FSFileHandle {
return FSFileHandle(rawValue: item.identifier.rawValue)
}
func close(_ handle: FSFileHandle) throws {
// Nothing to do
}
}
extension HelloVolume: FSVolume.IOOperations {
func read(
_ handle: FSFileHandle,
buffer: UnsafeMutableRawBufferPointer,
options: FSTaskOptions
) throws -> Int {
// Find item by handle
for item in items.values {
if item.identifier.rawValue == handle.rawValue {
if let content = item.content {
let copyLength = min(buffer.count, content.count)
content.withUnsafeBytes { src in
buffer.copyBytes(from: UnsafeRawBufferPointer(
start: src.baseAddress,
count: copyLength
))
}
return copyLength
}
}
}
return 0
}
func write(
_ handle: FSFileHandle,
buffer: UnsafeRawBufferPointer,
options: FSTaskOptions
) throws -> Int {
for item in items.values {
if item.identifier.rawValue == handle.rawValue {
item.content = Data(buffer)
return buffer.count
}
}
return 0
}
}
extension HelloVolume: FSVolume.DirectoryOperations {
func lookupItem(
named name: FSFileName,
inDirectory directory: FSItem
) throws -> (FSItem, FSFileName) {
if let item = items[name] {
return (item, name)
}
throw NSError(domain: "HelloFS", code: 2, userInfo: nil)
}
func enumerateDirectory(
_ directory: FSItem,
startingAt: UInt64,
verifier: inout FSItemVerifier,
attributes: FSItem.Attributes,
packer: FSItemPacker
) throws {
for (name, item) in items {
try packer.packItem(item, named: name)
}
}
}
// MARK: - File Item
final class HelloItem: FSItem {
let name: String
let type: ItemType
var content: Data?
private static var nextID: UInt64 = 1
init(name: String, type: ItemType) {
self.name = name
self.type = type
let id = HelloItem.nextID
HelloItem.nextID += 1
super.init(identifier: FSItem.Identifier(rawValue: id))
}
}