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 教程。