纯 MoonBit 的 ISO 9660 光盘映像读写库:卷描述符、目录树、Joliet、Rock Ridge 与镜像生成

moon add LL728/mooniso下列命令针对本仓库源码,请在仓库根目录执行(cmd/main 是相对的)。 作为依赖使用时请用上面的 moon add,按「库 API」一节调用。
moon run cmd/main -- info image.iso # 卷信息 + 启动信息
moon run cmd/main -- ls image.iso /SUB # 列目录
moon run cmd/main -- cat image.iso /HELLO.TXT # 打印文本
moon run cmd/main -- extract image.iso /BIG.BIN out # 落盘(二进制安全)
moon run cmd/main -- tree image.iso # 递归列出整棵树
moon run cmd/main -- extract-all image.iso ./out # 整树导出(跳过符号链接)
moon run cmd/main -- verify image.iso # 结构体检
moon run cmd/main -- udf-ls image.iso /Docs # 走 UDF 视角列目录
moon run cmd/main -- udf-cat image.iso /hello.txt # 走 UDF 视角读文件
moon run cmd/main -- create out.iso ./some-dir # 从目录生成映像
moon run cmd/main -- create out.iso ./some-dir --boot /boot.bin --efi /efi.img # BIOS+UEFI 双启动
moon run cmd/main -- create out.iso ./some-dir --link /link.txt=/hello.txt # 写入 RR 符号链接moon run examples/basic # 内存里造映像 -> 读回 -> 列出 -> 校验// 读
let image = @mooniso.IsoImage::open(@fs.read_file_to_bytes("image.iso"))
println(image.volume_id())
for entry in image.list_dir("/SUB") {
println("\{entry.name}\t\{entry.size}")
}
let bytes = image.read_file("/HELLO.TXT")
// 写
let builder = @mooniso.IsoBuilder::new()
builder.volume_id("MY_VOLUME")
builder.add_directory("/Docs")
builder.add_file("/Hello.txt", b"hi")
let image_bytes = builder.build()moon test --target wasm-gc # 单元测试:字节序、目录记录、Joliet、SUSP、El Torito、生成器回读
python tools/gen_fixtures.py # 生成 tools/corpus/*.iso(自身格式,可复现)
python tools/check_e2e.py # CLI 输出与期望逐行比对
python tools/gen_fixtures_pycdlib.py # 用 pycdlib 生成 Joliet/Rock Ridge/El Torito 映像与基准清单
python tools/gen_fixtures_udf.py # 用 pycdlib 生成 UDF 2.60 映像与基准清单
python tools/check_compat.py # 读取侧与 pycdlib 对拍
python tools/check_roundtrip.py # 写入侧:生成的映像由 pycdlib 读回比对(含可启动映像)pub(all) suberror IsoError {
Truncated
BadBothEndian
BadSignature
BadDescriptor(Int)
NotFound(String)
NotDirectory(String)
IsDirectory(String)
IsSymlink(String)
HostIoError(String)
BadDirectoryRecord(Int)
}pub struct BootEntry {
platform_id : Int
bootable : Bool
media_type : Int
sector_count : Int
load_lba : Int
}pub struct ByteReader {
data : Bytes
pos : Int
}pub struct DirectoryRecord {
extent : Int
size : Int
flags : Int
name : String
date : RecordDate
system_use : Bytes
posix_mode : Int?
symlink_target : String?
}fn IsoBuilder::boot_image(self : IsoBuilder, path : String, load_sectors : Int, platform : Int) -> Unitpub struct IsoImage {
data : Bytes
volume_id : String
block_size : Int
volume_space_size : Int
root : DirectoryRecord
joliet_root : DirectoryRecord?
joliet_level : Int
rock_ridge : Bool
}pub struct PrimaryVolumeDescriptor {
volume_id : String
volume_space_size : Int
logical_block_size : Int
path_table_size : Int
root : DirectoryRecord
}pub struct RecordDate {
year : Int
month : Int
day : Int
hour : Int
minute : Int
second : Int
gmt_offset_quarters : Int
}pub struct UdfExtent {
length : Int
location : Int
partition : Int
}pub struct ValidationReport {
directories : Int
files : Int
symlinks : Int
total_bytes : Int
problems : Array[String]
}pub struct WalkEntry {
path : String
is_dir : Bool
is_symlink : Bool
size : Int
}fn decode_ucs2_be(raw : Bytes) -> Stringfn normalize_iso_name(raw : String) -> Stringfn parse_directory_record_in(reader : ByteReader, joliet : Bool) -> (DirectoryRecord, Int) raise IsoErrorfn parse_primary_volume_descriptor(data : Bytes, lba : Int) -> PrimaryVolumeDescriptor raise IsoErrorInstall
Download zip纯 MoonBit 的 ISO 9660 光盘映像读写库:卷描述符、目录树、Joliet、Rock Ridge 与镜像生成