首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振文件创建错误:(OS错误:不允许操作,errno = 1)

颤振文件创建错误:(OS错误:不允许操作,errno = 1)
EN

Stack Overflow用户
提问于 2021-04-18 17:11:00
回答 1查看 10.7K关注 0票数 7

我正在尝试将excel文件保存到本地存储中,但在创建该文件时会遇到此错误。我在用物理设备调试。只有当设备有外部SD卡并配置为内部存储时,它才能工作。但是,当我在另一个设备(物理设备)上运行带有SD卡(配置为便携存储)的应用程序时,它不起作用,我得到了下面的错误。

误差

代码语言:javascript
运行
复制
[ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FileSystemException: Creation failed, path = '/storage/emulated/0/Traders' (OS Error: Operation not permitted, errno = 1)
E/flutter (15532): #0      _Directory.create.<anonymous closure> (dart:io/directory_impl.dart:117:11)
E/flutter (15532): #1      _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (15532): #2      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (15532): #3      _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter (15532): #4      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter (15532): #5      Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter (15532): #6      Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter (15532): #7      Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:577:7)
E/flutter (15532): #8      _rootRun (dart:async/zone.dart:1354:13)
E/flutter (15532): #9      _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (15532): #10     _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter (15532): #11     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter (15532): #12     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter (15532): #13     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
E/flutter (15532): 

我的代码

代码语言:javascript
运行
复制
import 'dart:io' as IO;

IO.Directory dir = await getExternalStorageDirectory();
    String outputFile = "report"+DateFormat('dd-MM-yyyy hh:mm:ss').format(DateTime.now())+".xls";
    if (await Permission.storage.request().isGranted) {

      if (!IO.Directory('${dir.parent.parent.parent.parent.parent.path}/Traders/Reports').existsSync())
        await IO.Directory('${dir.parent.parent.parent.parent.path}/Traders/Reports').create(recursive: true);
      final file = IO.File(join('${dir.parent.parent.parent.parent.path}/Traders/Reports',outputFile));
      await file.writeAsBytes(excel.encode()).then((value) {
        if(IO.Platform.isAndroid||IO.Platform.isIOS)
          OpenFile.open('${dir.parent.parent.parent.parent.path}/Traders/Reports/$outputFile');
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("File Saved !")));
      }).catchError((e){
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Error Saving File !")));
      });
    }else{
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Error:Permission denied.Grant storage permission to save file."),action: SnackBarAction(label: 'Grant',onPressed: ()async{
        await Permission.storage.request();
      },),));
    }

AndroidMalifest.xml

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 18:00:32

阿博维柯很乱。您可以使用这个包直接获取Home路径。(/storage/emulated/0)

然后你就可以简单地做这个

代码语言:javascript
运行
复制
var path = await ExtStorage.getExternalStorageDirectory();
final file = await File(path+'/Traders/Report').create(recursive: true);
file.writeAsStringSync("Hello I'm writting a stackoverflow answer into you");

这个包不是空安全的。所以在这种情况下我提供了本地代码。

一些省道文件,您需要路径

代码语言:javascript
运行
复制
exportPath = await channel.invokeMethod('getExternalStorageDirectory'); // Call native code like this in your dart file

然后实现这个

转到‘android-> app ->src->main->kotlin->.您的应用程序名->MainActivity.kt’。

代码语言:javascript
运行
复制
Add this


class MainActivity : FlutterFragmentActivity() {
    private val channel = "externalStorage";

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler { call, result ->
            when (call.method) {
                "getExternalStorageDirectory" ->
                    result.success(Environment.getExternalStorageDirectory().toString())
                "getExternalStoragePublicDirectory" -> {
                    val type = call.argument<String>("type")
                    result.success(Environment.getExternalStoragePublicDirectory(type).toString())
                }
                else -> result.notImplemented()
            }
        }

    }

}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67151331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档