fileUtils.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import 'dart:io';
  2. import 'dart:math';
  3. import 'package:convert/convert.dart';
  4. import 'package:crypto/crypto.dart';
  5. import 'package:path/path.dart' as path;
  6. import 'package:file_selector/file_selector.dart' as file_selector;
  7. import 'package:path_provider/path_provider.dart';
  8. import 'logger.dart';
  9. bool isDirectory(String filePath) {
  10. return FileSystemEntity.isDirectorySync(filePath);
  11. }
  12. Future<bool> isDirectoryExists(String filePath) {
  13. return Directory(filePath).exists();
  14. }
  15. bool isFile(String filePath) {
  16. return FileSystemEntity.isFileSync(filePath);
  17. }
  18. String getDirectoryName(String filePath) {
  19. return path.dirname(filePath);
  20. }
  21. Future<bool> isFileExists(String filePath) {
  22. return File(filePath).exists();
  23. }
  24. String getFileName(String filePath) {
  25. return path.basename(filePath);
  26. }
  27. String getFileNameWithoutExtension(String filePath) {
  28. return path.basenameWithoutExtension(filePath);
  29. }
  30. String getFileExtension(String filePath, {int level = 1}) {
  31. return path.extension(filePath, level);
  32. }
  33. Future<int> fileSizeOf(filePath) async {
  34. final file = File(filePath);
  35. final size = await file.length();
  36. return size;
  37. }
  38. String formatFileSize(int bytes) {
  39. if (bytes <= 0) return "0 B";
  40. const suffixes = ["B", "KB", "MB", "GB", "TB", "PB", "EB"];
  41. var i = (log(bytes) / log(1024)).floor();
  42. return '${(bytes / pow(1024, i)).toStringAsFixed(2)} ${suffixes[i]}';
  43. }
  44. // MD5
  45. Future<String> getFileMd5(String filePath) async {
  46. final fileExists = File(filePath).existsSync();
  47. if (!fileExists) throw FileSystemException("File does not exist", filePath);
  48. final file = File(filePath);
  49. final digest = await file.openRead().transform(md5).first;
  50. return hex.encode(digest.bytes);
  51. }
  52. Future<File?> createFile(String filePath) async {
  53. try {
  54. if (!await isFileExists(filePath)) {
  55. File file = await File(filePath).create(recursive: true);
  56. return file;
  57. } else {
  58. return File(filePath);
  59. }
  60. } catch (error) {
  61. return null;
  62. }
  63. }
  64. bool deleteFile(String filePath) {
  65. try {
  66. final file = File(filePath);
  67. file.deleteSync();
  68. return true;
  69. } catch (error) {
  70. return false;
  71. }
  72. }
  73. createFolder(String folderPath) async {
  74. // 创建文件夹
  75. final Directory folder = Directory(folderPath);
  76. // 如果文件夹不存在,则创建
  77. if (!await folder.exists()) {
  78. await folder.create(recursive: true);
  79. } else {
  80. Log.d("Folder already exists");
  81. }
  82. }
  83. copyDirectory(Directory source, Directory destination) async {
  84. await for (var entity in source.list(recursive: false)) {
  85. if (entity is Directory) {
  86. var newDirectory = Directory(
  87. path.join(destination.absolute.path, path.basename(entity.path)));
  88. await newDirectory.create(recursive: true);
  89. await copyDirectory(entity.absolute, newDirectory);
  90. } else if (entity is File) {
  91. await entity.copy(
  92. path.join(destination.path, path.basename(entity.path)));
  93. }
  94. }
  95. }
  96. clearDirectory(Directory directory) async {
  97. // 列出所有文件和文件夹
  98. var files = directory.listSync();
  99. // 遍历文件和文件夹
  100. for (var fileEntity in files) {
  101. if (fileEntity is File) {
  102. // 文件直接删除
  103. await fileEntity.delete();
  104. } else if (fileEntity is Directory) {
  105. // 文件夹则递归删除
  106. await clearDirectory(fileEntity);
  107. await fileEntity.delete();
  108. }
  109. }
  110. }
  111. deleteDirectory(String dirPath) async {
  112. final directory = Directory(dirPath);
  113. await directory.delete(recursive: true);
  114. }