ZetCode

Dart FileSystemCreateEvent

最后修改于 2025 年 4 月 4 日

Dart 中的 FileSystemCreateEvent 类代表文件系统的创建事件。它是 dart:io 库中文件系统监视器 API 的一部分。

当在监视的目录中创建文件或目录时,会触发此事件。它提供了有关已创建文件系统实体的信息。

基本定义

FileSystemCreateEventFileSystemEvent 的子类。它包含有关新创建文件或目录的详细信息。

主要属性包括事件类型、路径以及它是否为目录。该类有助于实时监视文件系统更改。

基本 FileSystemCreateEvent 用法

此示例展示了如何监视目录中的文件创建事件。

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 FileSystemCreateEvent) {
      print('Created: ${event.path}');
      print('Is directory: ${event.isDirectory}');
    }
  });
  
  // Trigger an event
  await File('${dir.path}/new_file.txt').create();
}

我们创建一个目录监视器并监听创建事件。当创建文件时,事件处理程序会打印其路径和类型。

$ dart main.dart
Created: watch_dir/new_file.txt
Is directory: false

区分文件和目录创建

此示例演示了区分文件和目录创建。

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 FileSystemCreateEvent) {
      if (event.isDirectory) {
        print('Directory created: ${event.path}');
      } else {
        print('File created: ${event.path}');
      }
    }
  });
  
  // Trigger events
  await File('${dir.path}/file1.txt').create();
  await Directory('${dir.path}/subdir').create();
}

该示例检查 isDirectory 属性以确定创建的实体是文件还是目录。这两种类型都会触发相同的事件类。

$ dart main.dart
File created: watch_dir/file1.txt
Directory created: watch_dir/subdir

处理多个事件

此示例展示了如何使用防抖来处理多个创建事件。

main.dart
import 'dart:io';
import 'dart:async';

void main() async {
  var dir = Directory('watch_dir');
  await dir.create();
  
  var debounceTimer;
  var watcher = dir.watch();
  
  watcher.listen((event) {
    if (event is FileSystemCreateEvent) {
      if (debounceTimer != null) {
        debounceTimer.cancel();
      }
      
      debounceTimer = Timer(Duration(milliseconds: 500), () {
        print('Creation event: ${event.path}');
      });
    }
  });
  
  // Create multiple files quickly
  for (var i = 0; i < 5; i++) {
    await File('${dir.path}/file_$i.txt').create();
    await Future.delayed(Duration(milliseconds: 100));
  }
}

我们使用防抖计时器来处理快速的文件创建事件。这可以防止在同时创建大量文件时造成拥塞。

$ dart main.dart
Creation event: watch_dir/file_4.txt

过滤特定文件类型

此示例演示了按文件扩展名过滤创建事件。

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 FileSystemCreateEvent && 
        !event.isDirectory && 
        event.path.endsWith('.dart')) {
      print('Dart file created: ${event.path}');
    }
  });
  
  // Create different file types
  await File('${dir.path}/script.dart').create();
  await File('${dir.path}/data.json').create();
  await File('${dir.path}/test.dart').create();
}

我们同时检查事件类型和文件扩展名来过滤特定的创建事件。在此示例中,仅记录 Dart 文件创建。

$ dart main.dart
Dart file created: watch_dir/script.dart
Dart file created: watch_dir/test.dart

递归监视

此示例展示了如何监视子目录中的创建事件。

main.dart
import 'dart:io';

void main() async {
  var dir = Directory('watch_dir');
  await dir.create(recursive: true);
  
  var watcher = dir.watch(recursive: true);
  watcher.listen((event) {
    if (event is FileSystemCreateEvent) {
      print('Created (recursive): ${event.path}');
    }
  });
  
  // Create nested structure
  await Directory('${dir.path}/subdir').create();
  await File('${dir.path}/subdir/file.txt').create();
}

通过设置 recursive: true,监视器会监视所有子目录。来自目录树任何级别的创建事件都将被捕获。

$ dart main.dart
Created (recursive): watch_dir/subdir
Created (recursive): watch_dir/subdir/file.txt

最佳实践

来源

Dart FileSystemCreateEvent 文档

本教程介绍了 Dart 的 FileSystemCreateEvent 类,并通过实际示例展示了文件系统监视、事件过滤和递归监视。

作者

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

列出 所有 Dart 教程