ZetCode

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

最佳实践

来源

Dart FileSystemEvent 文档

本教程介绍了 Dart 的 FileSystemEvent 类,并通过实际示例展示了文件系统监控、事件处理和错误管理。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写超过 1400 篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程