Kotlin Multiplatform如何跨平台获取可用磁盘空间?
KMP跨平台读取可用磁盘空间解决方案
Kotlin Multiplatform目前没有官方标准API用于跨平台读取磁盘空间,需要通过expect/actual机制实现平台特定逻辑,以下是针对JVM、Native(Linux/Windows)及JS平台的具体实现方案,同时也会提及社区推荐的封装库。
1. 通用层定义预期函数
在commonMain中声明预期函数,支持传入指定路径(默认当前目录):
// commonMain/src/.../DiskSpaceUtils.kt expect fun getFreeDiskSpaceKb(path: String = "."): Long
2. 各平台实际实现
JVM平台
直接复用Java的File类API,与你原有的实现逻辑一致,扩展支持自定义路径:
// jvmMain/src/.../DiskSpaceUtils.kt actual fun getFreeDiskSpaceKb(path: String): Long { val file = java.io.File(path) return if (file.exists()) file.freeSpace / 1024 else -1 }
Native Linux平台
通过POSIX的statvfs系统调用实现,借助Kotlin/Native的interop能力:
// linuxMain/src/.../DiskSpaceUtils.kt import kotlinx.cinterop.* import platform.posix.* actual fun getFreeDiskSpaceKb(path: String): Long { memScoped { val stat = alloc<statvfs>() return if (statvfs(path, stat.ptr) == 0) { (stat.st_bfree * stat.st_frsize) / 1024 } else { -1 // 读取失败返回-1,可根据需求调整错误处理逻辑 } } }
Native Windows平台
调用Win32 API的GetDiskFreeSpaceExW函数获取磁盘空间信息:
// windowsMain/src/.../DiskSpaceUtils.kt import kotlinx.cinterop.* import platform.windows.* actual fun getFreeDiskSpaceKb(path: String): Long { memScoped { val freeBytesAvailable = alloc<ULONGLONGVar>() val success = GetDiskFreeSpaceExW( path.wcstr.ptr, freeBytesAvailable.ptr, null, null ) != 0 return if (success) freeBytesAvailable.value / 1024 else -1 } }
JS平台
JS平台需区分运行环境:
- Node.js环境:通过Node.js的
fs模块调用statfsSync获取磁盘信息(Node.js 18+支持):
// jsMain/src/.../DiskSpaceUtils.kt (仅Node.js) actual fun getFreeDiskSpaceKb(path: String): Long { val fs = require("fs") return try { val statfs = fs.statfsSync(path) (statfs.bfree * statfs.bsize) / 1024 } catch (e: Throwable) { -1 } }
- 浏览器环境:受限于浏览器安全策略,无法直接访问本地磁盘空间,可返回-1或抛出明确异常提示。
3. 社区推荐库
如果不想手动编写各平台的interop代码,可以使用社区维护的KMP专用系统信息库,这类库已封装好磁盘空间读取等常用系统操作,无需重复实现平台适配逻辑。
内容的提问来源于stack exchange,提问作者user32786878
相关产品推荐
相关产品推荐

