Flutter 文件路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter 文件路径相关的知识,希望对你有一定的参考价值。

参考技术A path_provider是flutter提供的一个获取应用存储路径的插件,它封装了统一的api来获取androidios两个平台的应用存储路径,提供的api如下:

getTemporaryDirectory():获取应用临时文件夹,该文件夹用来保存应用的缓存,可以随时删除用于清缓存,对应于Android的getCacheDir()和ios的NSTemporaryDirectory();

getApplicationDocumentsDirectory():获取应用安装路径,在应用被卸载的时候删除,对应Android的AppDate目录和iOS的NSDocumentDirectory目录;

getExternalStorageDirectory():获取存储卡目录,仅支持Android;

我们通过File和Directory来创建文件和文件夹时首先要获取到应用的相关路径,不然会报错;

File对象和Directory对象封装在dart:io中,使用时需要先引入该库:

Directory对象提供listSync()方法获取文件夹里的内容,该方法返回一个数组;

文件和文件夹都通过delete删除,delete异步,deleteSync同步;如果一个文件夹是非空的删除会报错,删除非空文件夹需要先清空该文件夹:

flutter对json序列化需要引入 dart:convert 库:

通过jsonEncode/jsonDecode来转换json对象:

// 将test目录下的info.json复制到test2目录下的info2.json中

引入包archive包:

压缩:

压缩前使用ZipFileEncoder先声明处理压缩的对象,调用该对象的zipDirectory方法压缩文件,该方法接受两个参数,第一个是要压缩文件/文件夹的路径,第二个是压缩包的保存路径;

解压:

Flutter - 无法将文件复制到新路径

【中文标题】Flutter - 无法将文件复制到新路径【英文标题】:Flutter - Cannot copy file to new path 【发布时间】:2019-03-04 16:54:45 【问题描述】:

我想把图片复制到应用程序目录,但是总是报这个错误:

[ERROR:flutter/shell/common/shell.cc(181)] Dart 错误:未处理 异常:E/flutter(4159):FileSystemException:无法复制文件到 '/data/user/0/com.vendetta.recipe/app_flutter',路径 = '/storage/emulated/0/Android/data/com.vendetta.recipe/files/Pictures/a6fd32a9-60b2-4cff-8f10-2ffc2933bf751208556873045090039.jpg' (操作系统错误:是一个目录,errno = 21)E/flutter(4159):#0 _文件.copy。 (dart:io/file_impl.dart:340:9) E/flutter (4159): #1 _RootZone.runUnary (dart:async/zone.dart:1379:54) E/flutter (4159): #2 _FutureListener.handleValue (dart:async/future_impl.dart:129:18) E/flutter (4159): #3 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45) E/flutter (4159): #4 Future._propagateToListeners (dart:async/future_impl.dart:671:32) E/颤振(4159):#5 Future._completeWithValue (dart:async/future_impl.dart:486:5) E/flutter (4159): #6 Future._asyncComplete。 (dart:async/future_impl.dart:516:7) E/flutter (4159): #7 _microtaskLoop (dart:async/schedule_microtask.dart:41:21) E/flutter (4159): #8 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

我想复制这张图片,以确保当我保存它时,用户不会删除重要文件。我想将这个文件存储在数据库中。

这是我复制图像的代码,是用image_picker拍摄的:

Directory directory = await getApplicationDocumentsDirectory();
String path = directory.path;
File newImage = await _image.copy('$path');

我希望有人能够解决我的问题。

【问题讨论】:

【参考方案1】:

path 是目录/data/user/0/com.vendetta.recipe/app_flutter。尝试向其添加/filename.jpg

File newImage = await _image.copy('$path/filename.jpg');

【讨论】:

嘿,这会在 Android 10 中引发错误,errno 13,权限被拒绝 用户需要授予您写入某些目录的权限 等等,你的意思是我每次都需要询问用户存储访问权限吗?截至目前,我在打开应用程序时请求许可 但我得到了错误,即使我已经请求用户许可。我找到的解决方案是在29编译dk,并在Android manifest.xml中添加“allowLegacyExternalStorage”为true。我了解到这是由于 Android 10 中的范围存储,但是从现在开始如何使用外部存储目录? @NithinSai 你找到解决方案了吗我也面临这个问题【参考方案2】:

请试试这个,然后你的问题就解决了

我提供给你也可以动态复制任何扩展名的文件

按照这些步骤-

1.首先添加这个导入

import 'package:path/path.dart' as path;

2.获取带扩展名的文件名

 var basNameWithExtension = path.basename(sourceFile.path);

3.然后将扩展名传递给

var file =  await moveFile(sourceFile,newPath+"/"+basNameWithExtension);

4.然后写这个方法

Future<File> moveFile(File sourceFile, String newPath) async 
    try 
      /// prefer using rename as it is probably faster
      /// if same directory path
      return await sourceFile.rename(newPath);
     catch (e) 
      /// if rename fails, copy the source file 
      final newFile = await sourceFile.copy(newPath);
      return newFile;
    
  
    然后你会得到预期的结果

【讨论】:

喂,这样删除原文件吗? 我想使用复制或将我的文件移动到一个目录到另一个目录我该怎么做这是我的文件路径'/storage/emulated/0/Android/data/com.wasisoft.topi/ files/video1.mp4' 在这里我想移动我的文件路径'/storage/emulated/0/Download/video1. mp4',

以上是关于Flutter 文件路径的主要内容,如果未能解决你的问题,请参考以下文章

获取Flutter Web上传文件的路径

更改flutter使用的默认gradle文件夹路径

File_Picker 插件不返回 Flutter 中写入文件的绝对路径

Visual Studio Code 中的 Flutter SDK 路径问题

Flutter Web:文件选择器抛出“无效参数(路径):不能为空”错误

使用 Flutter web (chrome) 从系统目录获取文件路径以读取文件内容 例如:CSV 或文本文件