Dart FileSystemMoveEvent
最后修改于 2025 年 4 月 4 日
Dart 中的 FileSystemMoveEvent
类代表文件系统移动或重命名操作。它是 Dart 文件系统事件监控 API 的一部分。
当文件或目录在被监视的目录内被移动或重命名时,会触发此事件。它提供了有关旧路径和新路径的详细信息。
基本定义
FileSystemMoveEvent
是 FileSystemEvent
的子类。它包含有关文件系统中文件/目录移动操作的信息。
主要属性包括移动项的旧路径(源)和新路径(目标)。当发生移动时,它由 Directory.watch()
发出。
基本的 FileSystemMoveEvent 用法
此示例显示了如何监视目录中的文件移动事件。
main.dart
import 'dart:io'; void main() async { var dir = Directory('test_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemMoveEvent) { print('Move detected:'); print(' From: ${event.path}'); print(' To: ${event.destination}'); print(' Type: ${event.type}'); } }); // Simulate a file move var file = File('${dir.path}/test.txt'); await file.create(); await file.rename('${dir.path}/renamed.txt'); }
我们创建一个目录监视器并监听移动事件。当文件被重命名时,事件会同时提供原始路径和新路径。类型表示移动或重命名。
$ dart main.dart Move detected: From: test_dir/test.txt To: test_dir/renamed.txt Type: FileSystemEvent.move
处理目录移动
此示例演示了如何检测目录移动操作。
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 FileSystemMoveEvent) { print('Directory moved:'); print(' Source: ${event.path}'); print(' Target: ${event.destination}'); } }); // Create and move a subdirectory var subDir = Directory('${dir.path}/subdir'); await subDir.create(); await subDir.rename('${dir.path}/moved_subdir'); }
目录移动会触发与文件移动类似的事件。事件包含被移动目录的原始路径和新路径。这可以递归工作。
$ dart main.dart Directory moved: Source: watch_dir/subdir Target: watch_dir/moved_subdir
区分移动类型
此示例展示了如何区分移动和重命名。
main.dart
import 'dart:io'; void main() async { var dir = Directory('monitor_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemMoveEvent) { var isRename = event.path.split('/').last == event.destination.split('/').last; print(isRename ? 'File renamed' : 'File moved'); print(' Old: ${event.path}'); print(' New: ${event.destination}'); } }); // Test cases var file = File('${dir.path}/original.txt'); await file.create(); // Rename (same directory) await file.rename('${dir.path}/renamed.txt'); // Move (different directory) var newDir = Directory('${dir.path}/new_location'); await newDir.create(); await File('${dir.path}/renamed.txt') .rename('${newDir.path}/moved.txt'); }
我们通过比较父目录来区分重命名和移动。重命名保持相同的父目录,而移动会改变它。两者都会触发移动事件。
$ dart main.dart File renamed Old: monitor_dir/original.txt New: monitor_dir/renamed.txt File moved Old: monitor_dir/renamed.txt New: monitor_dir/new_location/moved.txt
移动事件中的错误处理
此示例演示了在文件系统移动操作期间的错误处理。
main.dart
import 'dart:io'; void main() async { var dir = Directory('error_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { if (event is FileSystemMoveEvent) { print('Move event detected'); try { var file = File(event.destination); print('File exists: ${file.existsSync()}'); } catch (e) { print('Error checking moved file: $e'); } } }); var file = File('${dir.path}/testfile.txt'); await file.create(); // Move to invalid location try { await file.rename('${dir.path}/nonexistent/subdir/file.txt'); } catch (e) { print('Move failed: $e'); } }
我们处理处理移动事件时可能发生的错误。即使移动操作失败,事件也会触发,因此目标验证很重要。
$ dart main.dart Move event detected Error checking moved file: FileSystemException: Cannot open file, path = 'error_dir/nonexistent/subdir/file.txt' (OS Error: No such file or directory, errno = 2) Move failed: FileSystemException: Cannot rename file to 'error_dir/nonexistent/subdir/file.txt', path = 'error_dir/testfile.txt' (OS Error: No such file or directory, errno = 2)
监视多个事件
此示例显示了如何处理包括移动事件在内的多种事件类型。
main.dart
import 'dart:io'; void main() async { var dir = Directory('multi_event_dir'); await dir.create(); var watcher = dir.watch(); watcher.listen((event) { switch (event.type) { case FileSystemEvent.move: print('Move event: ${event.path} → ${(event as FileSystemMoveEvent).destination}'); break; case FileSystemEvent.create: print('Create event: ${event.path}'); break; case FileSystemEvent.delete: print('Delete event: ${event.path}'); break; case FileSystemEvent.modify: print('Modify event: ${event.path}'); break; } }); // Trigger various events var file = File('${dir.path}/demo.txt'); await file.create(); await file.writeAsString('content'); await file.rename('${dir.path}/renamed_demo.txt'); await file.delete(); }
我们使用 switch 语句处理所有文件系统事件类型。移动事件被专门转换为以访问目标属性。每种事件类型都有自己的 case。
$ dart main.dart Create event: multi_event_dir/demo.txt Modify event: multi_event_dir/demo.txt Move event: multi_event_dir/demo.txt → multi_event_dir/renamed_demo.txt Delete event: multi_event_dir/renamed_demo.txt
最佳实践
- 过滤事件:在处理之前检查事件类型
- 处理错误:移动事件后验证路径
- 资源管理:完成后关闭监视器
- 性能:避免在事件处理程序中进行繁重的处理
- 跨平台:在不同操作系统上测试行为
来源
本教程通过实际示例介绍了 Dart 的 FileSystemMoveEvent 类,展示了文件和目录移动的检测、错误处理和事件处理。
作者
列出 所有 Dart 教程。