ZetCode

Dart FileSystemDeleteEvent

最后修改于 2025 年 4 月 4 日

Dart 中的 FileSystemDeleteEvent 类代表文件系统删除事件。它是 Dart 文件系统监控功能的一部分。

当文件或目录从被监控的位置被删除时,会触发此事件。它提供了有关被删除文件系统实体的信息。

基本定义

FileSystemDeleteEventFileSystemEvent 的子类。它表示文件或目录已从文件系统中删除。

主要属性包括事件类型、路径以及它是否为目录。这些有助于识别被删除的内容及其位置。

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

最佳实践

来源

Dart FileSystemDeleteEvent 文档

本教程通过实际示例涵盖了 Dart 的 FileSystemDeleteEvent 类,展示了文件和目录删除监控、错误处理和递归监控模式。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程