尝试在外部存储上创建文件时访问被拒绝的路径

时间:2016-12-28 21:28:59

标签: c# android xamarin.android

我希望我的Android应用程序使用EditText中的内容保存文本文件。当我执行以下操作时,新文件将按预期保存:

string[] filename = new string[50];
EditText et1 = FindViewById<EditText>(Resource.Id.editText1);
EditText et2 = FindViewById<EditText>(Resource.Id.editText2);
string doc = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
filename[0] = Path.Combine(doc, "Text1");
filename[1] = Path.Combine(doc, "Text2");
File.WriteAllText(filename[0], et1.Text);
File.WriteAllText(filename[1], et2.Text);

但如果我按如下方式更改文件名:

filename[0] = Path.Combine(doc, 1.ToString());
filename[1] = Path.Combine(doc, 2.ToString());

应用程序将合并确定的地址但不能在那里写入数据并抛出以下异常:

Error: Access to this address denied

我如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我尝试使用您的代码重现该问题但不能。这告诉我问题不在你的代码中。

我虽然在模拟器上运行,但这可能只是关键区别。

当您尝试access an external storage时,请确保您在清单中设置了以下权限:

WRITE_EXTERNAL_STORAGE (writing)
READ_EXTERNAL_STORAGE (reading)

在任何情况下,您都应该考虑是否特别想要将数据放在外部SD卡上。这可能会导致没有安装一个用户的问题。相反,您可以执行以下操作来访问内部存储,如Xamarin's documentation中所述,以获取有关在文件系统上存储内容的最佳实践:

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)

答案 1 :(得分:0)

您的例外是因为您忘记了AndroidMnaifest.xml中的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="yournamespace">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application .../>
</manifest>

你可以创建一个方法writeText()并调用它两次。您可以使用

的其他文件夹

string path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;

        writeText(et1.Text, "Text1.txt");
        writeText(et2.Text, "Text2.txt");

    void writeText(string text, string name) {
         string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
         string filename = Path.Combine(path, name);

         using(var streamWriter = new StreamWriter(filename, true)) {
          streamWriter.Write(text);
         }
    }