You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:44:51