A no-nonsense File API for Kotlin Multiplatform. It gets the job done.
fun main() {
val file = SysTempDir.resolve("path/to/../somewhere")
.canonicalFile2()
.mkdirs2(mode = "700", mustCreate = true)
.resolve("my_file.txt")
assertFalse(file.exists2())
assertEquals(true, file.parentFile?.exists2())
val data = "Hello World!".encodeToByteArray()
// See also openRead, openWrite, openAppend
file.openReadWrite(excl = OpenExcl.MustCreate.of("644")).use { stream ->
assertEquals(0L, stream.size())
assertEquals(0L, stream.postion())
stream.write(data)
assertEquals(data.size.toLong(), stream.size())
assertEquals(data.size.toLong(), stream.position())
val buf = ByteArray(data.size)
stream.position(new = 2L)
stream.read(buf, position = 0L)
assertEquals(2L, stream.position())
assertContentEquals(data, buf)
stream.size(new = 0L).sync(meta = true).write(buf)
}
file.appendBytes(excl = OpenExcl.MustExist, data)
file.chmod2("400")
assertContentEquals(data + data, file.readBytes())
assertEquals("Hello World!Hello World!", file.readUtf8())
file.delete2(ignoreReadOnly = true)
}The :async extension module
suspend fun main() {
AsyncFs.Default.with {
val file = SysTempDir.resolve("path/to/../somewhere")
.canonicalFile2Async()
.mkdirs2Async(mode = "700", mustCreate = true)
.resolve("my_file.txt")
assertFalse(file.exists2Async())
assertEquals(true, file.parentFile?.exists2Async())
val data = "Hello World!".encodeToByteArray()
// See also openRead, openWrite, openAppend
file.openReadWriteAsync(excl = OpenExcl.MustCreate.of("644")).use { stream ->
assertEquals(0L, stream.sizeAsync())
assertEquals(0L, stream.postionAsync())
stream.write(data)
assertEquals(data.size.toLong(), stream.sizeAsync())
assertEquals(data.size.toLong(), stream.positionAsync())
val buf = ByteArray(data.size)
stream.positionAsync(new = 2L)
stream.readAsync(buf, position = 0L)
assertEquals(2L, stream.positionAsync())
assertContentEquals(data, buf)
stream.sizeAsync(new = 0L).syncAsync(meta = true).writeAsync(buf)
}
file.appendBytesAsync(excl = OpenExcl.MustExist, data)
file.chmod2Async("400")
assertContentEquals(data + data, file.readBytesAsync())
assertEquals("Hello World!Hello World!", file.readUtf8Async())
file.delete2Async(ignoreReadOnly = true)
}
}dependencies {
val vKmpFile = "0.6.0"
implementation("io.matthewnelson.kmp-file:file:$vKmpFile")
// If you need async APIs
implementation("io.matthewnelson.kmp-file:async:$vKmpFile")
}