【问题标题】:How would you save the contents of a directory to a variable in dart?您如何将目录的内容保存到 dart 中的变量中?
【发布时间】:2020-07-30 20:35:46
【问题描述】:

我正在尝试在 Dart 中列出目录的内容,我首先尝试查看是否有一个函数可以将文件和子目录的名称作为数组返回,例如 os.listdir() 函数在蟒蛇。我找不到这样的功能。但是,经过一番搜索,我发现这段代码可以将目录的内容打印到终端,但无法将其保存到变量中。

var filesAndFolders;
var systemTempDir = Directory(".");
systemTempDir.list(recursive: false, followLinks: false)
    .listen((FileSystemEntity entity) {
        print(entity.path);
        filesAndFolders = entity.path;
    });
print(filesAndFolders);

这段代码的输出是:

null
./tmp
./NikScorchSkin.png
./Access Server
./System Cleanup.sh
./Access Server.py
./Access Server.dart
./Access Server.sh
./.mountAccessServer

另一个问题,虽然不那么重要,null 代表filesAndFolders,但打印在目录列表之前而不是之后。任何原因都会受到赞赏,但不是必需的

【问题讨论】:

    标签: dart directory


    【解决方案1】:

    您的示例没有多大意义,并且包含多个问题。放开他们每个人。

    filesAndFolders 的类型问题

    变量filesAndFolders 没有任何特定类型或使用值初始化。所以 Dart 在识别这个变量的类型时确实存在一些问题。如果您稍后在代码中使用此变量并认为它是某种列表,这对您没有帮助。

    由于我们要保存路径列表,我们可以初始化我们的列表以包含如下字符串:

    final filesAndFolders = <String>[];
    

    向列表中添加元素时,您应该调用add(),例如:

    filesAndFolders.add(entity.path);
    

    异步和同步操作相结合

    您正在对一个目录使用list 操作,该目录记录为返回Stream&lt;FileSystemEntity&gt;,这意味着我们将异步获取目录中的每个FileSystemEntity

    通过在Stream 上调用listen,您提供了一个回调方法,该方法将在Dart 从操作系统接收到文件列表时调用。因此,listen 调用不是同步的,Dart 只会在程序的其余部分中运行。

    这就是您看到print(filesAndFolders); 在您的回调方法之前运行的原因。

    此外,Dart 是单线程的,并且在后台使用事件队列。所以你给listen的回调方法只会在没有其他可以执行的情况下执行。

    对此有两种解决方案:

    同步。方式

    您可以改用listSync 方法,它返回List&lt;FileSystemEntity&gt;,您可以通过正常的同步方式进行处理:

      for (final entity in systemTempDir.listSync(recursive: false, followLinks: false)) {
        print(entity.path);
      }
    

    异步。方式

    Dart 允许我们标记一个方法async,它可以轻松指示我们何时想要异步等待某事发生。因此,我们可以将您的代码重写为:

    void main() async {
    ...
    
      await for (final entity in systemTempDir.list(recursive: false, followLinks: false)) {
        print(entity.path);
      }
    }
    

    通过使用await for,我们可以轻松订阅Stream,并在继续执行其余方法之前处理每个事件。

    最终的方法在同步和异步中都是这样的:

    同步

    import 'dart:io';
    
    void main() {
      final filesAndFolders = <String>[];
      final systemTempDir = Directory(".");
    
      for (final entity in systemTempDir.listSync(recursive: false, followLinks: false)) {
        print(entity.path);
        filesAndFolders.add(entity.path);
      }
      print(filesAndFolders);
    }
    

    异步

    import 'dart:io';
    
    void main() async {
      final filesAndFolders = <String>[];
      final systemTempDir = Directory(".");
    
      await for (final entity in systemTempDir.list(recursive: false, followLinks: false)) {
        print(entity.path);
        filesAndFolders.add(entity.path);
      }
      print(filesAndFolders);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2020-09-11
      • 2011-09-04
      相关资源
      最近更新 更多