Dart FileSystemCreateEvent
最后修改于 2025 年 4 月 4 日
Dart 中的 FileSystemCreateEvent
类代表文件系统的创建事件。它是 dart:io
库中文件系统监视器 API 的一部分。
当在监视的目录中创建文件或目录时,会触发此事件。它提供了有关已创建文件系统实体的信息。
基本定义
FileSystemCreateEvent
是 FileSystemEvent
的子类。它包含有关新创建文件或目录的详细信息。
主要属性包括事件类型、路径以及它是否为目录。该类有助于实时监视文件系统更改。
基本 FileSystemCreateEvent 用法
此示例展示了如何监视目录中的文件创建事件。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemCreateEvent) { print('Created: ${event.path}'); print('Is directory: ${event.isDirectory}'); } }); // Trigger an event await File('${dir.path}/new_file.txt').create(); }
我们创建一个目录监视器并监听创建事件。当创建文件时,事件处理程序会打印其路径和类型。
$ dart main.dart Created: watch_dir/new_file.txt Is directory: false
区分文件和目录创建
此示例演示了区分文件和目录创建。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemCreateEvent) { if (event.isDirectory) { print('Directory created: ${event.path}'); } else { print('File created: ${event.path}'); } } }); // Trigger events await File('${dir.path}/file1.txt').create(); await Directory('${dir.path}/subdir').create(); }
该示例检查 isDirectory
属性以确定创建的实体是文件还是目录。这两种类型都会触发相同的事件类。
$ dart main.dart File created: watch_dir/file1.txt Directory created: watch_dir/subdir
处理多个事件
此示例展示了如何使用防抖来处理多个创建事件。
main.dart
import 'dart:io'; import 'dart:async'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var debounceTimer; var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemCreateEvent) { if (debounceTimer != null) { debounceTimer.cancel(); } debounceTimer = Timer(Duration(milliseconds: 500), () { print('Creation event: ${event.path}'); }); } }); // Create multiple files quickly for (var i = 0; i < 5; i++) { await File('${dir.path}/file_$i.txt').create(); await Future.delayed(Duration(milliseconds: 100)); } }
我们使用防抖计时器来处理快速的文件创建事件。这可以防止在同时创建大量文件时造成拥塞。
$ dart main.dart Creation event: watch_dir/file_4.txt
过滤特定文件类型
此示例演示了按文件扩展名过滤创建事件。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemCreateEvent && !event.isDirectory && event.path.endsWith('.dart')) { print('Dart file created: ${event.path}'); } }); // Create different file types await File('${dir.path}/script.dart').create(); await File('${dir.path}/data.json').create(); await File('${dir.path}/test.dart').create(); }
我们同时检查事件类型和文件扩展名来过滤特定的创建事件。在此示例中,仅记录 Dart 文件创建。
$ dart main.dart Dart file created: watch_dir/script.dart Dart file created: watch_dir/test.dart
递归监视
此示例展示了如何监视子目录中的创建事件。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(recursive: true); var watcher = dir.watch(recursive: true); watcher.listen((event) { if (event is FileSystemCreateEvent) { print('Created (recursive): ${event.path}'); } }); // Create nested structure await Directory('${dir.path}/subdir').create(); await File('${dir.path}/subdir/file.txt').create(); }
通过设置 recursive: true
,监视器会监视所有子目录。来自目录树任何级别的创建事件都将被捕获。
$ dart main.dart Created (recursive): watch_dir/subdir Created (recursive): watch_dir/subdir/file.txt
最佳实践
- 错误处理:始终在监听器中处理监视器错误
- 资源清理:在不再需要时取消监视器
- 性能:避免在事件处理程序中使用昂贵的操作
- 递归:谨慎使用递归监视大型目录树
来源
本教程介绍了 Dart 的 FileSystemCreateEvent 类,并通过实际示例展示了文件系统监视、事件过滤和递归监视。
作者
列出 所有 Dart 教程。