Dart FileSystemEvent
最后修改于 2025 年 4 月 4 日
Dart 中的 FileSystemEvent
类代表文件系统的更改。它与 Directory.watch() 一起用于监控文件和目录。
FileSystemEvent 提供有关创建、修改、删除和移动操作的信息。它是 Dart 的 dart:io
库的一部分,用于 I/O 操作。
基本定义
FileSystemEvent
是一个抽象类,具有不同事件类型的具体子类。这些包括创建、修改、删除和移动事件。
关键属性包括 path、type,以及(对于移动事件)destination path。事件通过 Directory.watch() 的流异步传递。
基本文件监控
此示例展示了使用 FileSystemEvent 的基本文件系统监控。
main.dart
import 'dart:io'; void main() async { var dir = Directory.current; var watcher = dir.watch(); await for (var event in watcher) { print('Event type: ${event.type}'); print('Path: ${event.path}'); if (event is FileSystemMoveEvent) { print('Destination: ${event.destination}'); } } }
我们为当前目录创建一个监视器并监听事件。代码会打印事件详细信息,包括对移动事件的特殊处理。
$ dart main.dart Event type: FileSystemEvent.create Path: /path/to/newfile.txt
过滤特定事件类型
此示例演示了如何过滤特定的文件系统事件类型。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var watcher = dir.watch(); await for (var event in watcher) { switch (event.type) { case FileSystemEvent.create: print('File created: ${event.path}'); break; case FileSystemEvent.modify: print('File modified: ${event.path}'); break; case FileSystemEvent.delete: print('File deleted: ${event.path}'); break; } } }
我们监视一个特定的目录并单独处理不同的事件类型。这允许对不同的文件系统操作进行定制响应。
$ dart main.dart File created: watch_dir/test.txt File modified: watch_dir/test.txt
处理移动事件
此示例侧重于检测和处理文件移动/重命名操作。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(); var watcher = dir.watch(); await for (var event in watcher) { if (event is FileSystemMoveEvent) { print('File moved/renamed:'); print('From: ${event.path}'); print('To: ${event.destination}'); print('Is directory: ${event.isDirectory}'); } } }
移动事件比较特殊,因为它们包含源路径和目标路径。isDirectory 属性指示移动的项是文件还是目录。
$ dart main.dart File moved/renamed: From: watch_dir/old.txt To: watch_dir/new.txt Is directory: false
递归监视
此示例展示了如何监视一个目录及其所有子目录。
main.dart
import 'dart:io'; void main() async { var dir = Directory('watch_dir'); await dir.create(recursive: true); var watcher = dir.watch(recursive: true); await for (var event in watcher) { print('Event in ${event.isDirectory ? 'directory' : 'file'}:'); print('Path: ${event.path}'); print('Type: ${event.type}'); } }
recursive 标志将监控扩展到所有子目录。我们还检查每个事件是影响文件还是目录。
$ dart main.dart Event in directory: Path: watch_dir/subdir Type: FileSystemEvent.create
文件监视中的错误处理
此示例演示了文件系统监视的正确错误处理。
main.dart
import 'dart:io'; void main() async { try { var dir = Directory('nonexistent_dir'); var watcher = dir.watch(); await for (var event in watcher) { print('Event: ${event.type} at ${event.path}'); } } on FileSystemException catch (e) { print('Error watching directory: ${e.message}'); } catch (e) { print('Unexpected error: $e'); } }
我们将 watch 操作包装在 try-catch 块中以处理潜在的错误。这包括被监视的目录不存在或无法访问的情况。
$ dart main.dart Error watching directory: Directory listing failed
最佳实践
- 资源清理:不再需要时取消订阅
- 错误处理:始终处理潜在的 I/O 错误
- 性能:注意对大型树进行递归监视
- 事件批处理:某些平台可能会批处理多个更改
- 跨平台:行为可能因操作系统而异
来源
本教程介绍了 Dart 的 FileSystemEvent 类,并通过实际示例展示了文件系统监控、事件处理和错误管理。
作者
列出 所有 Dart 教程。