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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:20:18