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)
顾名思义,listSync
method 是阻塞版本:
// create a list of entries
List<FileSystemEntity> entries = dir.listSync(recursive: false).toList();
Run Code Online (Sandbox Code Playgroud)
使用什么方法取决于应用程序上下文。直接来自文档的注释:
除非您有使用方法的同步版本的特定原因,否则首选异步版本以避免阻塞您的程序。
Sur*_*gch 12
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)
使用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支持两种方法供你使用!
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)
里面和异步函数这样写
List<FileSystemEntity> allContents = await Directory("folder/path").list().toList();
Run Code Online (Sandbox Code Playgroud)
现在您有一个包含所有内容的列表
归档时间: |
|
查看次数: |
4534 次 |
最近记录: |