如何使用 Flutter "saf" 包进行文件操作(create/write/update/delete 文件)
How to do file operations (create/write/update/delete files) using the Flutter "saf" Package
如何使用 Flutter "saf" 包进行文件操作(create/write/update/delete 个文件)。
link:- pub.dev/packages/saf
我在 Google 上没有找到任何解决方案。我想使用 Android“存储访问框架”并让用户 select 外部存储上的文件夹。在此文件夹中,我想保存用户可以访问的我的应用程序文件。
以前我使用的是应用专用存储 (Android/data/com.myapp)。但由于 Google 的安全更新,11 位用户无法访问此文件夹。
任何解决方案将不胜感激。提前致谢。
bool? isGranted = await saf.getDirectoryPermission(isDynamic: false);
if (isGranted != null && isGranted) {
// Perform some file operations
// **But How?**
} else {
// failed to get the permission
}
检查这个 Link
SAF 仅用于权限处理。写、读操作由dart执行。
找到正确的本地路径
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
创建对文件位置的引用
Future get _localFile async {
final path = await _localPath;
return File('$path/counter.txt');
}
** 将数据写入文件**
Future writeCounter(int counter) async {
final file = await _localFile;
// Write the file
return file.writeAsString('$counter');
}
首先使用saf flutter package获取待操作目录的权限
import 'package:saf/saf.dart';
await Saf.getDynamicDirectoryPermission()
Flutter中使用dart的文件操作:io核心包
创建
var myFile = File('file.txt');
阅读
File('file.txt').readAsString().then((String contents) {
print(contents);
});
写入
final filename = 'file.txt';
var file = await File(filename).writeAsString('some content');
删除
var myFile = File('file.txt');
myFile.delete();
来源: https://api.dart.dev/stable/2.16.1/dart-io/File-class.html
如果您使用存储访问框架获得文件夹访问权限,则无法使用 dart: 'dart: io' 程序包对此文件夹执行文件处理操作。
检查 URL: 此外,从 Android 11 及更高版本开始,在没有 MANAGE_EXTERNAL_STORAGE 许可的情况下,几乎完全不推荐使用 java.io.File 从外部存储访问数据。
我在flutter中找到了两个支持Storage Access Framework的Package
shared_storage 0.2.0 提供给我们
Uri uri = await openDocumentTree();
List<UriPermission> persistedUris = await persistedUriPermissions();
和
/// Create a new file using the `SAF` API
final newDocumentFile = await createDocumentFile(
mimeType: 'text/plain',
content: 'My Plain Text Comment Created by shared_storage plugin',
displayName: 'CreatedBySharedStorageFlutterPlugin',
directory: anySelectedUriByTheOpenDocumentTreeAPI,
);
print(newDocumentFile);
通过上述方法可以使用writeAsString()而不是writeAsBytes()来创建文件。但是为了创建 Image 文件,我们需要 writeAsBytes().
saf 1.0.3+3 在 document_file.dart 中有方法 createFileAsBytes() 但在当前版本中不可用。
但在未来,这两个包都会提供这些 API。
解法:
目前,我已经通过同时使用这两个包解决了这个问题。
在您的pubspec.yaml中添加软件包:
并使用下面的代码
void createFileBySAF(String fileName, Uint8List uint8list) {
/*From: shared_storage: ^0.2.0*/
Uri uri = await openDocumentTree();
/*From: saf: ^1.0.3+3*/
Map<String, dynamic> result = await MethodChannel('com.ivehement.plugins/saf/documentfile').invokeMapMethod<String, dynamic>('createFile', <String, dynamic>{
'mimeType': 'any',
'content': uint8list,
'displayName': fileName,
'directoryUri': '$uri',
});
print(result);
}
对于更新和删除操作,请在 https://github.com/ivehement/saf/blob/master/lib/src/storage_access_framework/document_file.dart
中找到用法
如何使用 Flutter "saf" 包进行文件操作(create/write/update/delete 个文件)。
link:- pub.dev/packages/saf
我在 Google 上没有找到任何解决方案。我想使用 Android“存储访问框架”并让用户 select 外部存储上的文件夹。在此文件夹中,我想保存用户可以访问的我的应用程序文件。
以前我使用的是应用专用存储 (Android/data/com.myapp)。但由于 Google 的安全更新,11 位用户无法访问此文件夹。
任何解决方案将不胜感激。提前致谢。
bool? isGranted = await saf.getDirectoryPermission(isDynamic: false);
if (isGranted != null && isGranted) {
// Perform some file operations
// **But How?**
} else {
// failed to get the permission
}
检查这个 Link SAF 仅用于权限处理。写、读操作由dart执行。
找到正确的本地路径
Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; }
创建对文件位置的引用
Future get _localFile async { final path = await _localPath; return File('$path/counter.txt'); }
** 将数据写入文件**
Future writeCounter(int counter) async { final file = await _localFile;
// Write the file return file.writeAsString('$counter'); }
首先使用saf flutter package获取待操作目录的权限
import 'package:saf/saf.dart';
await Saf.getDynamicDirectoryPermission()
Flutter中使用dart的文件操作:io核心包
创建
var myFile = File('file.txt');
阅读
File('file.txt').readAsString().then((String contents) {
print(contents);
});
写入
final filename = 'file.txt';
var file = await File(filename).writeAsString('some content');
删除
var myFile = File('file.txt');
myFile.delete();
来源: https://api.dart.dev/stable/2.16.1/dart-io/File-class.html
如果您使用存储访问框架获得文件夹访问权限,则无法使用 dart: 'dart: io' 程序包对此文件夹执行文件处理操作。
检查 URL:
我在flutter中找到了两个支持Storage Access Framework的Package
shared_storage 0.2.0 提供给我们
Uri uri = await openDocumentTree();
List<UriPermission> persistedUris = await persistedUriPermissions();
和
/// Create a new file using the `SAF` API
final newDocumentFile = await createDocumentFile(
mimeType: 'text/plain',
content: 'My Plain Text Comment Created by shared_storage plugin',
displayName: 'CreatedBySharedStorageFlutterPlugin',
directory: anySelectedUriByTheOpenDocumentTreeAPI,
);
print(newDocumentFile);
通过上述方法可以使用writeAsString()而不是writeAsBytes()来创建文件。但是为了创建 Image 文件,我们需要 writeAsBytes().
saf 1.0.3+3 在 document_file.dart 中有方法 createFileAsBytes() 但在当前版本中不可用。
但在未来,这两个包都会提供这些 API。
解法: 目前,我已经通过同时使用这两个包解决了这个问题。
在您的pubspec.yaml中添加软件包:
并使用下面的代码
void createFileBySAF(String fileName, Uint8List uint8list) {
/*From: shared_storage: ^0.2.0*/
Uri uri = await openDocumentTree();
/*From: saf: ^1.0.3+3*/
Map<String, dynamic> result = await MethodChannel('com.ivehement.plugins/saf/documentfile').invokeMapMethod<String, dynamic>('createFile', <String, dynamic>{
'mimeType': 'any',
'content': uint8list,
'displayName': fileName,
'directoryUri': '$uri',
});
print(result);
}
对于更新和删除操作,请在 https://github.com/ivehement/saf/blob/master/lib/src/storage_access_framework/document_file.dart
中找到用法