Disk 是 ZerOS 内核的虚拟磁盘管理接口,提供磁盘分区管理、格式化、使用情况统计等功能。所有磁盘数据存储在 Exploit 程序(PID 10000)的内存中,文件系统数据持久化到 localStorage。
NodeTreeCollection - 文件树集合(用于文件系统操作)KernelMemory - 内核内存(用于存储磁盘元数据)Disk.diskSize = 3 * 1024 * 1024 * 1024; // 3GB 总磁盘大小
磁盘在系统启动时自动初始化,从 DiskData.json 读取分区配置并创建分区:
Disk.init(); // 从 DiskData.json 读取配置并初始化分区(如果 DiskData.json 不存在,则创建 C: (1GB) 和 D: (2GB) 分区作为默认配置)
注意:
DiskData.json 读取配置,分区会按照优先级排序:D: 优先,其他分区按字母顺序init()初始化磁盘分区(自动创建 C: 和 D: 分区,向后兼容)。
示例:
Disk.init(); // 创建 C: (1GB) 和 D: (2GB),支持通过 format() 创建其他分区(A-Z)
format(separateName, size)格式化磁盘分区。支持 A-Z 共 26 个分区。
参数:
separateName (string): 分区名称(如 "C:", "D:", "E:" 等,支持 A-Z)size (number): 分区大小(字节)示例:
// 格式化 C: 分区,大小为 1GB
Disk.format("C:", 1024 * 1024 * 1024);
// 格式化 D: 分区,大小为 2GB(D: 是系统盘)
Disk.format("D:", 2 * 1024 * 1024 * 1024);
// 格式化 E: 分区,大小为 500MB(支持所有 A-Z 分区)
Disk.format("E:", 500 * 1024 * 1024);
update()更新磁盘使用情况(计算已用和空闲空间)。
示例:
Disk.update(); // 更新所有分区的使用情况
diskSeparateMap (getter)获取磁盘分区映射表。
返回值: Map<string, NodeTreeCollection> - 分区名称到文件树集合的映射
示例:
const partitions = Disk.diskSeparateMap;
partitions.forEach((nodeTree, partitionName) => {
console.log(`分区: ${partitionName}`);
});
diskSeparateSize (getter)获取磁盘分区大小映射表。
返回值: Map<string, number> - 分区名称到大小的映射
示例:
const sizes = Disk.diskSeparateSize;
sizes.forEach((size, partitionName) => {
console.log(`${partitionName}: ${size} 字节`);
});
diskFreeMap (getter)获取磁盘空闲区映射表。
返回值: Map<string, number> - 分区名称到空闲空间的映射
示例:
const free = Disk.diskFreeMap;
free.forEach((freeSize, partitionName) => {
console.log(`${partitionName} 空闲: ${freeSize} 字节`);
});
diskUsedMap (getter)获取磁盘已用区映射表。
返回值: Map<string, number> - 分区名称到已用空间的映射
示例:
const used = Disk.diskUsedMap;
used.forEach((usedSize, partitionName) => {
console.log(`${partitionName} 已用: ${usedSize} 字节`);
});
canUsed (getter/setter)获取或设置磁盘可用状态。
返回值: boolean - 磁盘是否可用
示例:
// 检查磁盘是否可用
if (Disk.canUsed) {
// 执行磁盘操作
}
// 设置磁盘可用状态
Disk.canUsed = true;
getMap(mapName, key)从指定的 Map 中获取值。
参数:
mapName (string): Map 名称('diskSeparateMap', 'diskSeparateSize', 'diskFreeMap', 'diskUsedMap')key (string): 键名返回值: * - Map 中的值
示例:
// 获取 C: 分区的大小
const cSize = Disk.getMap('diskSeparateSize', 'C:');
// 获取 C: 分区的文件树
const cTree = Disk.getMap('diskSeparateMap', 'C:');
setMap(mapName, key, value)设置 Map 中的值。
参数:
mapName (string): Map 名称key (string): 键名value (*): 值返回值: Map - 更新后的 Map
示例:
// 设置 C: 分区的大小
Disk.setMap('diskSeparateSize', 'C:', 1024 * 1024 * 1024);
deleteMap(mapName, key)从 Map 中删除键值对。
参数:
mapName (string): Map 名称key (string): 键名返回值: boolean - 是否成功
示例:
Disk.deleteMap('diskSeparateSize', 'E:');
forEachMap(mapName, fn)遍历 Map。
参数:
mapName (string): Map 名称fn (Function): 回调函数 (value, key) => {}示例:
// 遍历所有分区
Disk.forEachMap('diskSeparateSize', (size, partitionName) => {
console.log(`${partitionName}: ${size} 字节`);
});
Disk 本身不直接提供文件操作,文件操作通过 NodeTreeCollection 进行:
// 获取 C: 分区的文件树
const cTree = Disk.getMap('diskSeparateMap', 'C:');
// 使用 NodeTreeCollection 进行文件操作
// 详见 NodeTree API 文档
// 更新磁盘使用情况
Disk.update();
// 获取所有分区信息
const partitions = Disk.diskSeparateMap;
const sizes = Disk.diskSeparateSize;
const used = Disk.diskUsedMap;
const free = Disk.diskFreeMap;
partitions.forEach((nodeTree, partitionName) => {
const size = sizes.get(partitionName) || 0;
const usedSize = used.get(partitionName) || 0;
const freeSize = free.get(partitionName) || 0;
console.log(`${partitionName}:`);
console.log(` 总大小: ${size} 字节`);
console.log(` 已用: ${usedSize} 字节`);
console.log(` 空闲: ${freeSize} 字节`);
console.log(` 使用率: ${((usedSize / size) * 100).toFixed(2)}%`);
});
// 检查是否有足够空间(假设需要 500MB)
const requiredSize = 500 * 1024 * 1024;
let availableSpace = Disk.diskSize;
// 计算已分配的空间
Disk.forEachMap('diskSeparateSize', (size) => {
availableSpace -= size;
});
if (availableSpace >= requiredSize) {
// 格式化新分区
Disk.format('E:', requiredSize);
Disk.update();
console.log('分区 E: 格式化成功');
} else {
console.error('空间不足,无法创建新分区');
}
// 获取 C: 分区的文件树
const cTree = Disk.getMap('diskSeparateMap', 'C:');
if (cTree) {
// 使用 NodeTreeCollection 的方法操作文件
// 例如:列出根目录文件
const rootNode = cTree.nodes.get('C:');
if (rootNode) {
// 遍历文件
rootNode.attributes.forEach((file, fileName) => {
console.log(`文件: ${fileName}`);
});
// 遍历子目录
rootNode.children.forEach((child, dirName) => {
console.log(`目录: ${dirName}`);
});
}
}
磁盘数据持久化到 localStorage:
filesystem_{partitionName}(如 filesystem_C:)init()update() 更新磁盘使用情况Disk.diskSize(3GB)NodeTreeCollection 进行,而不是直接通过 Disk;NodeTree 在无有效本地快照或仅含根节点时会从 FSDirve 重建目录树,详见 NodeTree.md