default_saver.dart 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'dart:io' as io; // Используем префикс io
  2. import 'dart:typed_data';
  3. import 'package:flutter_cache_manager/flutter_cache_manager.dart';
  4. import 'package:path_provider/path_provider.dart';
  5. import 'package:path/path.dart' as p;
  6. class DefaulFileManager {
  7. final io.Directory directory;
  8. DefaulFileManager._(this.directory);
  9. static Future<DefaulFileManager> init() async {
  10. final dir = await getApplicationDocumentsDirectory();
  11. return DefaulFileManager._(dir);
  12. }
  13. /// Вспомогательный метод для сборки полного пути
  14. String _buildPath(String key, String? extension) {
  15. final fileName = extension != null ? '$key.$extension' : key;
  16. return p.join(directory.path, fileName);
  17. }
  18. Future<io.File> saveFile({
  19. required String key,
  20. required Uint8List bytes, // Изменили имя для ясности, что это байты
  21. String? extension,
  22. }) async {
  23. // Формируем путь. Если расширение не передано, файл будет без него
  24. final String fullPath = _buildPath(key, extension);
  25. final file = io.File(fullPath);
  26. // Записываем байты в файл.
  27. // flush: true гарантирует, что данные будут сброшены на диск перед завершением Future
  28. return await file.writeAsBytes(bytes, flush: true);
  29. }
  30. /// 2. Получение файла (например, для Image.file(file))
  31. Future<io.File?> getFile(String key, {String? extension}) async {
  32. final path = _buildPath(key, extension);
  33. final file = io.File(path);
  34. if (await file.exists()) {
  35. return file;
  36. } else {
  37. DefaultCacheManager defaultCacheManager = DefaultCacheManager();
  38. FileInfo? file = await defaultCacheManager.getFileFromCache(key);
  39. if (file != null) {
  40. await saveFile(key: key, bytes: file.file.readAsBytesSync());
  41. await defaultCacheManager.removeFile(key);
  42. return file.file;
  43. }
  44. }
  45. return null;
  46. }
  47. /// 3. Проверка: существует ли файл?
  48. Future<bool> exists(String key, {String? extension}) async {
  49. return await io.File(_buildPath(key, extension)).exists();
  50. }
  51. /// Метод удаления файла
  52. Future<bool> deleteFile({required String key, String? extension}) async {
  53. try {
  54. final String fullPath = _buildPath(key, extension);
  55. final file = io.File(fullPath);
  56. if (await file.exists()) {
  57. await file.delete();
  58. return true; // Файл успешно удален
  59. }
  60. return false; // Файл не найден
  61. } catch (e) {
  62. print('Ошибка при удалении файла: $e');
  63. return false;
  64. }
  65. }
  66. }