文件存储是 Flutter 中保存大量数据、图片、文件的解决方案。
添加依赖
path_provider: ^2.1.4
添加权限
Dart
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
引用
import 'package:path_provider/path_provider.dart';
文件操作
获取路径各种路径
Dart
// 临时目录(可随时被系统清理)
Directory tempDir = await getTemporaryDirectory();
print("临时目录: ${tempDir.path}");
// 应用文档目录(用户数据,备份时会备份)
Directory docsDir = await getApplicationDocumentsDirectory();
print("文档目录: ${docsDir.path}");
// 外部存储(Android 的 SD 卡)
if (Platform.isAndroid) {
Directory? externalDir = await getExternalStorageDirectory();
print("外部存储: ${externalDir?.path}");
}
// 应用支持目录(缓存、数据库等)
Directory supportDir = await getApplicationSupportDirectory();
print("支持目录: ${supportDir.path}");
创建文件
Dart
// 获取文档目录
Directory docsDir = await getApplicationDocumentsDirectory();
// 创建文件对象
File file = File('${docsDir.path}/my_file.txt');
// 写入内容(自动创建文件)
await file.writeAsString('Hello Flutter!');
print("文件创建成功: ${file.path}");
写入内容
Dart
// 方式1:写入字符串
await file.writeAsString('这是内容');
// 方式2:写入字节
List<int> bytes = [72, 101, 108, 108, 111];
await file.writeAsBytes(bytes);
// 方式3:追加内容
await file.writeAsString('追加的内容', mode: FileMode.append);
读取内容
Dart
// 检查文件是否存在
if (await file.exists()) {
// 读取字符串
String content = await file.readAsString();
print("内容: $content");
// 读取字节
List<int> bytes = await file.readAsBytes();
print("字节: $bytes");
// 按行读取
List<String> lines = await file.readAsLines();
for (var line in lines) {
print("行: $line");
}
} else {
print("文件不存在");
}
删除文件
Dart
if (await file.exists()) {
await file.delete();
print("文件已删除");
}
复制/移动文件
Dart
Directory docsDir = await getApplicationDocumentsDirectory();
File source = File('${docsDir.path}/source.txt');
File target = File('${docsDir.path}/target.txt');
// 复制
await source.copy(target.path);
// 移动(先复制再删除)
await source.copy(target.path);
await source.delete();
目录操作
创建目录
Dart
Directory docsDir = await getApplicationDocumentsDirectory();
// 创建单级目录
Directory dir = Directory('${docsDir.path}/my_folder');
await dir.create();
// 创建多级目录
Directory deepDir = Directory('${docsDir.path}/folder1/folder2/folder3');
await deepDir.create(recursive: true);
列出目录内容
Dart
Directory docsDir = await getApplicationDocumentsDirectory();
// 列出所有文件和目录
List<FileSystemEntity> entities = await docsDir.list().toList();
for (var entity in entities) {
if (entity is File) {
print("文件: ${entity.path}");
} else if (entity is Directory) {
print("目录: ${entity.path}");
}
}
// 只列出文件
List<File> files = await docsDir
.list()
.where((entity) => entity is File)
.map((entity) => entity as File)
.toList();
删除目录
Dart
if (await dir.exists()) {
// 删除空目录
await dir.delete();
// 删除非空目录(递归)
await dir.delete(recursive: true);