Dart FileSystemDeleteEvent
最后修改于 2025 年 4 月 4 日
Dart 中的 FileSystemDeleteEvent 类代表文件系统删除事件。它是 Dart 文件系统监控功能的一部分。
当文件或目录从被监控的位置被删除时,会触发此事件。它提供了有关被删除文件系统实体的信息。
基本定义
FileSystemDeleteEvent 是 FileSystemEvent 的子类。它表示文件或目录已从文件系统中删除。
主要属性包括事件类型、路径以及它是否为目录。这些有助于识别被删除的内容及其位置。
FileSystemDeleteEvent 基本用法
本示例展示了如何监视目录中的文件删除事件。
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 FileSystemDeleteEvent) {
print('Deleted: ${event.path}');
print('Is directory: ${event.isDirectory}');
}
});
// Simulate file deletion after delay
await Future.delayed(Duration(seconds: 1));
File('${dir.path}/test.txt').create().then((file) {
Future.delayed(Duration(seconds: 1), () => file.delete());
});
}
我们创建一个目录监视器并监听删除事件。当文件被删除时,事件会提供路径和类型信息。
$ dart main.dart Deleted: watch_dir/test.txt Is directory: false
处理目录删除
本示例演示了检测目录删除事件。
main.dart
import 'dart:io';
void main() async {
var parentDir = Directory('parent_dir');
await parentDir.create();
var watcher = parentDir.watch();
watcher.listen((event) {
if (event is FileSystemDeleteEvent && event.isDirectory) {
print('Directory deleted: ${event.path}');
}
});
// Create and then delete a subdirectory
var subDir = Directory('${parentDir.path}/sub_dir');
await subDir.create();
await Future.delayed(Duration(seconds: 1));
await subDir.delete();
}
我们通过检查 isDirectory 属性来专门监视目录删除。当子目录被移除时,会触发事件。
$ dart main.dart Directory deleted: parent_dir/sub_dir
多个事件类型
本示例展示了区分不同的文件系统事件。
main.dart
import 'dart:io';
void main() async {
var dir = Directory('multi_event_dir');
await dir.create();
var watcher = dir.watch();
watcher.listen((event) {
if (event is FileSystemDeleteEvent) {
print('Delete event: ${event.path}');
} else if (event is FileSystemCreateEvent) {
print('Create event: ${event.path}');
} else if (event is FileSystemModifyEvent) {
print('Modify event: ${event.path}');
}
});
// Trigger multiple events
var file = File('${dir.path}/data.txt');
await file.create();
await file.writeAsString('content');
await file.delete();
}
我们单独处理不同的事件类型。删除事件在文件创建和修改后被移除时触发。
$ dart main.dart Create event: multi_event_dir/data.txt Modify event: multi_event_dir/data.txt Delete event: multi_event_dir/data.txt
错误处理
本示例为文件系统监控添加了错误处理。
main.dart
import 'dart:io';
void main() async {
var dir = Directory('error_dir');
try {
var watcher = dir.watch();
watcher.listen((event) {
if (event is FileSystemDeleteEvent) {
print('Deleted: ${event.path}');
}
}, onError: (error) {
print('Error: $error');
});
// Simulate deletion of watched directory
await dir.create();
await Future.delayed(Duration(seconds: 1));
await dir.delete();
} catch (e) {
print('Exception: $e');
}
}
我们同时处理同步异常和异步错误。如果被监控的目录本身被删除,监视器可能会出错。
$ dart main.dart Error: FileSystemException: Directory watching failed, path = 'error_dir'
递归监控
本示例演示了删除的递归目录监控。
main.dart
import 'dart:io';
void main() async {
var rootDir = Directory('root_dir');
await rootDir.create();
// Watch recursively
var watcher = rootDir.watch(recursive: true);
watcher.listen((event) {
if (event is FileSystemDeleteEvent) {
print('Deleted (recursive): ${event.path}');
}
});
// Create and delete nested structure
var nestedDir = Directory('${rootDir.path}/a/b/c');
await nestedDir.create(recursive: true);
var nestedFile = File('${nestedDir.path}/file.txt');
await nestedFile.create();
await Future.delayed(Duration(seconds: 1));
await nestedFile.delete();
await nestedDir.delete();
}
通过递归监控,我们可以检测目录树中任何级别的删除。事件会触发子文件夹中文件和目录的删除。
$ dart main.dart Deleted (recursive): root_dir/a/b/c/file.txt Deleted (recursive): root_dir/a/b/c
最佳实践
- 资源清理: 完成后务必取消监视器
- 错误处理: 同时实现 try-catch 和 onError
- 明智地递归: 仅在需要时使用递归模式
- 事件过滤: 在处理之前检查事件类型
- 路径处理: 使用绝对路径进行可靠跟踪
来源
本教程通过实际示例涵盖了 Dart 的 FileSystemDeleteEvent 类,展示了文件和目录删除监控、错误处理和递归监控模式。
作者
列出 所有 Dart 教程。