关于android:Flutter-无法将文件复制到新路径

Flutter - Cannot copy file to new path

我想将图像复制到应用程序目录,但是我总是会收到此错误:

[ERROR:flutter/shell/common/shell.cc(181)] Dart Error: Unhandled
exception: E/flutter ( 4159): FileSystemException: Cannot copy file to
'/data/user/0/com.vendetta.recipe/app_flutter', path =
'/storage/emulated/0/Android/data/com.vendetta.recipe/files/Pictures/a6fd32a9-60b2-4cff-8f10-2ffc2933bf751208556873045090039.jpg'
(OS Error: Is a directory, errno = 21) E/flutter ( 4159): #0
_File.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/flutter ( 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拍摄的:

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

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


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

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

请尝试此操作,然后问题就解决了

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

按着这些次序 -

1.首先添加此导入

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

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

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

3.然后将扩展名传递给

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

4.然后写这个方法

1
2
3
4
5
6
7
8
9
10
11
12
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 and then delete it
      final newFile = await sourceFile.copy(newPath);
       await sourceFile.delete();
      return newFile;
    }
  }

  • 这样您将获得预期的结果