如何使用Dart列出目录的内容?

Set*_*add 16 dart dart-io

我想使用Dart列出目录(在文件系统上)的所有内容.我怎样才能做到这一点?

att*_*ona 16

list方法返回一个Stream,其中每个发出的事件都是一个目录条目:

Directory dir = Directory('.');
// execute an action on each entry
dir.list(recursive: false).forEach((f) {
  print(f);
});
Run Code Online (Sandbox Code Playgroud)

顾名思义,listSyncmethod 是阻塞版本:

// create a list of entries
List<FileSystemEntity> entries = dir.listSync(recursive: false).toList();
Run Code Online (Sandbox Code Playgroud)

使用什么方法取决于应用程序上下文。直接来自文档的注释:

除非您有使用方法的同步版本的特定原因,否则首选异步版本以避免阻塞您的程序。


Sur*_*gch 12

如何在 Dart 中列出目录的内容

final dir = Directory('path/to/directory');
final List<FileSystemEntity> entities = await dir.list().toList();
Run Code Online (Sandbox Code Playgroud)

这将根据路径创建一个目录。然后将其转换为 的列表FileSystemEntity,可以是 a File、 aDirectory或 a Link。默认情况下,子目录不会递归列出。

如果要打印该列表,请添加以下行:

entities.forEach(print);
Run Code Online (Sandbox Code Playgroud)

如果您只想获取文件,那么您可以这样做:

final Iterable<File> files = entities.whereType<File>();
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。上面的那些要么在 API 和/或 Dart 风格中已经过时,要么过于复杂。 (2认同)

Set*_*add 8

这个答案已经过时了.请参阅接受的答案.

使用Dart VM和dart:io库列出目录内容有两种方法.

(注意:以下内容仅适用于在命令行或服务器端应用程序上运行时的Dart VM.这在浏览器中或编译为JavaScript时不起作用.)

建立

首先,您需要导入dart:io库.该库包含访问文件,目录等所需的类.

import 'dart:io';
Run Code Online (Sandbox Code Playgroud)

其次,创建一个新的Directory类实例.

var dir = new Directory('path/to/my/dir');
Run Code Online (Sandbox Code Playgroud)

在脚本中列出内容

最简单的方法是使用新listSync方法.这将返回一个内容列表.默认情况下,这不会递归.

List contents = dir.listSync();
for (var fileOrDir in contents) {
  if (fileOrDir is File) {
    print(fileOrDir.name);
  } else if (fileOrDir is Directory) {
    print(fileOrDir.path);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果要通过目录递归,可以使用可选参数recursive.

List allContents = dir.listSync(recursive: true);
Run Code Online (Sandbox Code Playgroud)

警告如果您的目录结构具有循环符号链接,则上述代码将崩溃,因为它以递归方式跟随符号链接.

listSync当您使用Dart编写shell脚本,命令行实用程序或类似的应用程序或脚本时,此方法使用特别有用.

在服务器中列出内容

列出目录内容的第二种方法是使用异步版本list.当您需要列出目录以响应HTTP请求时,可以使用第二种方法.请记住,每个Dart的隔离区都在一个线程中运行.任何长时间运行的进程都可以阻止事件循环.当交互性很重要,或者从单个Dart脚本为大量客户端提供服务时,请使用异步版本.

使用异步版本,dir.list()返回a DirectoryLister.您可以在DirectoryLister上注册三个不同的回调:

  • onFile:遇到文件或目录时调用
  • onDone:当目录lister完成列出内容时调用
  • onError:当列表遇到一些错误时调用

这是一个简单的函数,它返回一个字符串列表的Future,其中包含目录中的文件名:

Future<List<String>> dirContents(Directory dir) {
  var filenames = <String>[];
  var completer = new Completer();
  var lister = dir.list();
  lister.onFile = (filename) => filenames.add(filename);
  // should also register onError
  lister.onDone = (_) => completer.complete(filenames);
  return completer.future;
}
Run Code Online (Sandbox Code Playgroud)

当然,这种方法非常适合服务器,对于简单的脚本来说更麻烦.

幸运的是,Dart支持两种方法供你使用!


Nic*_*ico 6

API已更改,并且我更新了M4版本(0.5.16_r23799)的异步代码:

Future<List<FileSystemEntity>> dirContents(Directory dir) {
  var files = <FileSystemEntity>[];
  var completer = new Completer();
  var lister = dir.list(recursive: false);
  lister.listen ( 
      (file) => files.add(file),
      // should also register onError
      onDone:   () => completer.complete(files)
      );
  return completer.future;
}
Run Code Online (Sandbox Code Playgroud)


New*_*oPi 6

里面和异步函数这样写

List<FileSystemEntity> allContents = await Directory("folder/path").list().toList();
Run Code Online (Sandbox Code Playgroud)

现在您有一个包含所有内容的列表