【问题标题】:Cannot create files on Android with Xamarin无法使用 Xamarin 在 Android 上创建文件
【发布时间】:2014-02-11 16:15:00
【问题描述】:

我有一个适用于 Android 的 Xamarin-Studio 应用程序,我只想下载文件并将它们保存在本地。但是当我尝试在files 文件夹中创建一个文件时,我得到一个异常:

File.Create("data/data/com.company.app/files/newFile.png");

给我:

System.UnauthorizedAccessException
Access to the path 'data/data/com.company.app/files/newFile.png' is denied.

我做错了什么?

【问题讨论】:

  • 您使用的是 Mac OS X 吗?
  • 你怎么知道“文件”存在?你在检查这个吗?
  • 是的,我在 OS X 上。我已经对我的测试设备进行了植根,并使用根浏览器检查了 files 确实存在。我还使用了一个 Dropbox 框架,它在那里成功地创建了文件。我只是无法手动创建文件...
  • 路径前面不应该有斜杠吗?

标签: c# android xamarin.android xamarin


【解决方案1】:

您应该使用环境或独立存储。例如:

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var filename = Path.Combine(path, "newFile.png");

【讨论】:

    【解决方案2】:

    我正在使用 VS2013 编写 Xamarin。对于使用我正在编写的应用程序创建的目录,我遇到了访问被拒绝错误。我的应用程序通过以下方式连接创建了一个名为 /storage/emulated/0/POIApp 的目录:

    System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "POIApp");
    

    我发现我必须使用VS2013来编辑我的应用程序(POIApp)的“属性”,即右键单击解决方案资源管理器中的项目图标;从弹出菜单中选择属性。一个新选项卡出现在 VS2013 主窗口中。左侧有几个选项,例如Application、Android Manifest、Android Options、Build等。选择“Android Manifest”。主面板底部是“所需权限”部分。当我检查“READ_EXTERNAL_STORAGE”和“WRITE_EXTERNAL_STORAGE”时,我的问题就解决了。

    【讨论】:

      【解决方案3】:

      在 Android.Manifest 文件中添加以下权限

      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

      【讨论】:

        【解决方案4】:

        我终于意识到File.create() 不是问题所在。我有这样的代码:

        string tmpFilePath = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
        Java.IO.File tmpFile = new Java.IO.File( tmpFilePath);
        tmpFile.Mkdirs ();
        

        然而,Mkdirs() 不仅像我假设的那样创建所有中间目录,而且还在文件路径本身创建一个目录。所以无法创建文件,因为已经有一个同名的目录。 正确的做法是:

        string tmpFile = FilesDir.AbsolutePath.stringByAppendingPath (f.Path);
        Java.IO.File tmpParentFolder = new Java.IO.File(tmpFile).getParentFile();
        tmpParentFolder.Mkdirs ();
        

        在我的辩护中,FileExistsAndIsDirectory 异常会比UnauthorizedAccessException 更有帮助

        【解决方案5】:

        使用Mono,我认为必须和Xamarin Studio中的一样。

        var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        File.Create(path + "newFile.png");
        

        【讨论】:

        • 这不是给我 SD 卡的文件路径吗?我需要在 Apps 包中编写内部存储。
        • 试试Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        • System.Environment 不包含GetFolderPath方法
        猜你喜欢
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多