ISO9660

使用纯 Swift API 读取/写入 ISO9660 (CD, DVD) 镜像。 它支持的最新规范是 ECMA-119 第四版,2019年6月

概述

光盘媒体使用 ISO 9660 格式来存储其内容,以及相关的辅助标准,如 Joliet 扩展、 系统使用共享协议Rock Ridge

此库提供了一个纯 Swift API,它在用户空间中运行,可以直接访问和操作 ISO 镜像,而无需挂载这些镜像。

读取 ISO 镜像

import Foundation
import ISO9660

// create media
let media = try! ISOImageFileMedia("cdimage.iso")

// create a filesystem object using this media
let fs = try! ISOFileSystem(media)

// access root directory and list its children
let dir = try! fs.getFSEntry("/")
for child in try fs.list(directory: directory) {
    print(child.name)
}

// get input stream to a file
let file = try! fs.getFSEntry("/some/file/of/mine")
let inputStream = try! fs.readFile(file)
defer {
    inputStream.close()
}
while inputStream.hasBytesAvailable {
    // do something
}

写入 ISO 镜像

import Foundation
import ISO9660

let folderRoot = "path/to/data"

// create media
let media = try! ISOImageFileMedia("cdimage.iso", readonly: false)

// prepare write options
let writeOptions = ISOWriter.WriteOptions(volumeIdentifier: "MYDATA")

// prepare writer - the last parameter is a closure that returns an `InputStream`
// to the file referenced by `path`
let writer = ISOWriter(media: media, options: writeOptions) { path in
    let localPath = "\(folderRoot)\(path)"
    return InputStream(fileAtPath: localPath)!
}

// add a file
let volPath = "/boot/grub.cfg"
let localPath = "\(folderRoot)\(volPath)"
let fileSize = try! FileManager.default.attributesOfItem(atPath: localPath)[.size] as! UInt64
try! writer.addFile(path: volPath, size: fileSize, metadata: nil)

// write 
try! writer.writeAndClose()

规范

ISO 9660 规范的技术细节在 ECMA-119 中指定。 对于通常的读取/写入操作来说,这并非必需,但本节对于那些试图了解底层机制的人来说可能很有用。

在较高层次上,需要理解以下重要概念:

规范资源

许可证

ISO9660 在 MIT 许可证下发布。 有关详细信息,请参见 LICENSE

贡献

除非您明确声明,否则您有意提交的任何贡献,都应按照上述许可进行许可。 您还声明该贡献全部或部分由您创建,并且您有权根据上述许可提交该作品。