Flutter桌面应用如何获取硬盘可用空间?disk_space包无法适配桌面平台
在Flutter桌面应用中获取硬盘可用空间的方案
因为disk_space包不支持桌面平台,你可以针对Windows、macOS、Linux分别通过执行系统命令并解析输出的方式来获取硬盘可用空间,以下是各平台的实现代码:
Windows平台
通过wmic命令查询指定盘符的可用空间:
import 'dart:io'; import 'dart:convert'; Future<double> getWindowsDiskFreeSpace(String driveLetter) async { final result = await Process.run('wmic', [ 'logicaldisk', 'where', 'caption="$driveLetter:"', 'get', 'freespace', '/value' ]); if (result.exitCode != 0) { throw Exception('获取磁盘空间失败: ${result.stderr}'); } final output = result.stdout.toString(); final match = RegExp(r'FreeSpace=(\d+)').firstMatch(output); if (match == null) { throw Exception('无法解析磁盘空间信息'); } final freeBytes = int.parse(match.group(1)!); // 转换为GB单位返回 return freeBytes / (1024 * 1024 * 1024); }
macOS平台
通过df命令查询指定路径所在磁盘的可用空间:
import 'dart:io'; import 'dart:convert'; Future<double> getMacOSDiskFreeSpace(String path) async { // 指定LC_ALL=C确保输出为英文格式,避免解析失败 final result = await Process.run( 'df', ['-k', path], environment: {'LC_ALL': 'C'} ); if (result.exitCode != 0) { throw Exception('获取磁盘空间失败: ${result.stderr}'); } final lines = LineSplitter.split(result.stdout.toString()).toList(); if (lines.length < 2) { throw Exception('无法解析磁盘空间信息'); } // 拆分输出行,第3列是可用空间(KB) final parts = lines[1].split(RegExp(r'\s+')); final freeKB = int.parse(parts[3]); // 转换为GB单位返回 return freeKB / (1024 * 1024); }
Linux平台
同样使用df命令查询,逻辑和macOS类似:
import 'dart:io'; import 'dart:convert'; Future<double> getLinuxDiskFreeSpace(String path) async { // 指定LC_ALL=C确保输出为英文格式 final result = await Process.run( 'df', ['-k', path], environment: {'LC_ALL': 'C'} ); if (result.exitCode != 0) { throw Exception('获取磁盘空间失败: ${result.stderr}'); } final lines = LineSplitter.split(result.stdout.toString()).toList(); if (lines.length < 2) { throw Exception('无法解析磁盘空间信息'); } // 拆分输出行,第4列是可用空间(KB) final parts = lines[1].split(RegExp(r'\s+')); final freeKB = int.parse(parts[3]); // 转换为GB单位返回 return freeKB / (1024 * 1024); }
跨平台整合方法
可以封装一个统一的方法,自动根据当前平台调用对应实现:
Future<double> getDiskFreeSpace(String path) async { if (Platform.isWindows) { // 从路径提取盘符(比如C:\xxx 提取C) final driveLetter = path.substring(0, 1).toUpperCase(); return getWindowsDiskFreeSpace(driveLetter); } else if (Platform.isMacOS) { return getMacOSDiskFreeSpace(path); } else if (Platform.isLinux) { return getLinuxDiskFreeSpace(path); } else { throw Exception('当前平台不支持'); } }
注意事项
- 权限问题:Linux或macOS下,若查询的路径需要特殊权限,可能会获取失败,需确保应用有对应访问权限
- 输出适配:通过设置
LC_ALL=C强制命令输出为英文格式,避免因系统语言不同导致解析规则失效
内容的提问来源于stack exchange,提问作者Moïse Rajesearison
相关产品推荐
相关产品推荐

