Flutter获取存储全类型文件及文件夹方案咨询(flutter_file_manager已废弃)
替代flutter_file_manager的设备文件遍历方案
方案1:自定义实现(基于Dart IO + 权限处理)
这是最稳定灵活的方案,不依赖第三方文件管理包,完全自主控制遍历逻辑。
步骤:
- 添加依赖到
pubspec.yaml:
dependencies: permission_handler: ^10.2.0 path_provider: ^2.0.11
- 请求存储权限:
import 'package:permission_handler/permission_handler.dart'; Future<bool> requestStoragePermission() async { final status = await Permission.storage.request(); return status.isGranted; }
- 获取设备存储根路径:
import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<String> getStorageRoot() async { if (Platform.isAndroid) { return (await getExternalStorageDirectory())?.path ?? ''; } else if (Platform.isIOS) { return (await getApplicationDocumentsDirectory()).path; } return ''; }
- 递归遍历所有文件和文件夹:
import 'dart:io'; Future<List<FileSystemEntity>> getAllFilesAndFolders(String dirPath) async { final entities = <FileSystemEntity>[]; final directory = Directory(dirPath); if (!await directory.exists()) return entities; final items = directory.listSync(recursive: false); for (final item in items) { entities.add(item); if (item is Directory) { entities.addAll(await getAllFilesAndFolders(item.path)); } } return entities; }
方案2:使用file_picker实现文件夹选择+遍历
如果需求是让用户手动选择文件夹后再遍历内容,file_picker是维护活跃的成熟方案:
- 添加依赖:
dependencies: file_picker: ^5.3.2
- 选择文件夹并遍历:
import 'package:file_picker/file_picker.dart'; Future<void> pickAndTraverseFolder() async { final selectedFolder = await FilePicker.platform.getDirectoryPath(); if (selectedFolder != null) { final allEntities = await getAllFilesAndFolders(selectedFolder); // 处理获取到的文件/文件夹列表 } }
注:遍历逻辑可复用方案1中的getAllFilesAndFolders函数
关键注意事项
- Android 13及以上版本,除了
Permission.storage,还需根据文件类型请求READ_MEDIA_IMAGES、READ_MEDIA_AUDIO等细分权限。 - iOS需在
Info.plist中添加NSDocumentDirectoryUsageDescription等权限描述,说明访问存储的用途。
内容的提问来源于stack exchange,提问作者Faizan Abbas Bangash
相关产品推荐
相关产品推荐

