You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.8 KiB
60 lines
1.8 KiB
2 months ago
|
// file_utils.dart
|
||
|
import 'dart:async';
|
||
|
import 'dart:io';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:file_picker/file_picker.dart';
|
||
2 months ago
|
import 'package:win_text_editor/frame/providers/logger.dart';
|
||
2 months ago
|
|
||
|
class FileUtils {
|
||
|
static Future<String?> pickFile(BuildContext context) async {
|
||
|
try {
|
||
|
final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false);
|
||
|
return result?.files.single.path;
|
||
|
} catch (e) {
|
||
|
Logger().error('选择文件失败: ${e.toString()}');
|
||
|
if (context.mounted) {
|
||
|
ScaffoldMessenger.of(
|
||
|
context,
|
||
|
).showSnackBar(SnackBar(content: Text('选择文件失败: ${e.toString()}')));
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static Future<String?> readFileContent(
|
||
|
BuildContext context,
|
||
|
String filePath, {
|
||
|
Duration timeout = const Duration(seconds: 30),
|
||
|
}) async {
|
||
|
try {
|
||
|
final content = await File(filePath).readAsString().timeout(
|
||
|
timeout,
|
||
|
onTimeout: () {
|
||
|
throw TimeoutException('文件加载超时,可能文件过大');
|
||
|
},
|
||
|
);
|
||
|
return content;
|
||
|
} on FormatException {
|
||
|
if (context.mounted) {
|
||
|
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('这不是可读的文本文件')));
|
||
|
}
|
||
|
return null;
|
||
|
} on FileSystemException catch (e) {
|
||
|
if (context.mounted) {
|
||
|
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('文件访问错误: ${e.message}')));
|
||
|
}
|
||
|
return null;
|
||
|
} catch (e) {
|
||
|
Logger().error('读取文件失败: ${e.toString()}');
|
||
|
if (context.mounted) {
|
||
|
ScaffoldMessenger.of(
|
||
|
context,
|
||
|
).showSnackBar(SnackBar(content: Text('读取失败: ${e.toString()}')));
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 移除showLoadingDialog方法,因为现在直接在调用处处理
|
||
|
}
|