我有 dart 代码,可以将文件打开为
RandomAccessFile
并从文件中读取数据并通过 Http 将字节流式传输到视频播放器,但是当用户查找视频时,我需要将文件的位置设置为新位置,并且再次阅读会引发异常
FileSystemException:异步操作当前正在挂起
这是因为之前的读取请求尚未完成,我请求了新的读取。 我如何取消/处置读取的旧文件以便我可以读取新位置?
没有直接的方法可以做到这一点,但您可以为此创建辅助函数:
class FileHelper {
bool _cancel = false;
Future<void> fileReadWithCancel(String path) async {
final file = File(path);
final stream = file.openRead();
final sub = stream.listen(null);
sub.onData((data) {
if (_cancel) {
sub.cancel();
print('Canceled!');
return;
}
// Handle data.
});
sub.onError((error) {
if (_cancel) {
sub.cancel();
print('Canceled!');
return;
}
// Handle error with log from dart:developer or similar.
});
sub.onDone(() {
// Good! :D
});
}
void cancel() => _cancel = true;
}
这是包含辅助函数并使用
_cancel
标志的类。
调用 cancel
方法后,您将停止阅读内容,并且流将关闭。
这是一个例子:
import 'dart:io';
import 'package:flutter/material.dart';
Future<void> main() async {
final helper = FileHelper();
helper.fileReadWithCancel(path); //Path to your file.
await Future.delayed(const Duration(seconds: 2));
helper.cancel();
}
这代表了一个最小的示例,您可以根据自己的代码对其进行修改和调整。