首页 > 解决方案 > 有什么方法可以使用 Flutter/Dart 在 Windows 上列出物理磁盘?

问题描述

有谁知道使用 Flutter 在 Windows 上列出物理磁盘的方法?

我做了很多研究,但找不到任何东西。只有path_provider,但它只提供对临时位置的访问。

我怀疑这是不可能的...

标签: flutterdart

解决方案


我认为 SDK 中没有任何方法可以提供这样的功能。但是您可以调用另一个可执行文件并解析结果。

在 Windows 中,您可以通过以下方式获取可用驱动器的列表:

C:\>wmic logicaldisk get caption
Caption
C:
E:
F:
G:
Z:

所以我们可以在 Dart 中创建以下内容:

import 'dart:convert';
import 'dart:io';

Future<void> main() async {
  print(await getDrivesOnWindows()); // (C:, E:, F:, G:, Z:)
}

Future<Iterable<String>> getDrivesOnWindows() async => LineSplitter.split(
        (await Process.run('wmic', ['logicaldisk', 'get', 'caption'],
                stdoutEncoding: const SystemEncoding()))
            .stdout as String)
    .map((string) => string.trim())
    .where((string) => string.isNotEmpty)
    .skip(1);

一个更复杂的示例,展示了如何为每个驱动器获取多个值。可以为空,因为未连接的freeSpace网络驱动器(或空的 CD/DVD 驱动器)在询问可用磁盘空间时不返回任何值:

import 'dart:convert';
import 'dart:io';

Future<void> main() async {
  (await WindowsDrive.getDrives()).forEach(print);
  // DriveLetter: C:, FreeSpace: 20392869888
  // DriveLetter: E:, FreeSpace: null
  // DriveLetter: F:, FreeSpace: 69761130496
  // DriveLetter: G:, FreeSpace: 85562028032
  // DriveLetter: Z:, FreeSpace: null
}

class WindowsDrive {
  final String driveLetter;
  final int? freeSpace;

  const WindowsDrive(this.driveLetter, this.freeSpace);

  // Node,Caption,FreeSpace
  factory WindowsDrive.parse(String line) {
    final segments = line.split(',');
    return WindowsDrive(segments[1], int.tryParse(segments[2]));
  }

  @override
  String toString() => 'DriveLetter: $driveLetter, FreeSpace: $freeSpace';

  static Future<Iterable<WindowsDrive>> getDrives() async =>
      LineSplitter.split((await Process.run(
                  'wmic',
                  [
                    'logicaldisk',
                    'get',
                    'caption',
                    ',',
                    'freespace',
                    '/format:csv'
                  ],
                  stdoutEncoding: const SystemEncoding()))
              .stdout as String)
          .map((string) => string.trim())
          .where((string) => string.isNotEmpty)
          .skip(1)
          .map((e) => WindowsDrive.parse(e));
}

推荐阅读