Xamarin Android 保存文本文件

9

我正在使用Xamarin.Android,想要将一个.txt文件保存到SD卡上。这是我正在使用的代码:

  private void SavetoSd()
  {
       var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.Path;
       var filePath = System.IO.Path.Combine(sdCardPath, "iootext.txt");
       if (!System.IO.File.Exists(filePath))
       {
           using(System.IO.StreamWriter write = new System.IO.StreamWriter(filePath,true))
           {
               write.Write(etSipServer.ToString());
           }
       }    
  }

然而,我收到以下错误信息:

System.UnauthorizedAccessException:拒绝访问路径“/mnt/sdcard/iootext.txt”。

我已将以下内容添加到清单中:

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

我该如何修复这个错误?


你尝试过什么?也许dir不可写(写入位未设置),或整个SD已挂载为只读。 - Bart Friederichs
如果您事后添加了权限,请尝试在设备上卸载应用程序,清理项目并重新构建。有时它们会失步,因为构建过程尝试进行优化 :) - Sven-Michael Stübe
我卸载了,但没有帮助 :/ - Wuhu
你正在运行哪个版本的Android?如果你正在运行Marshmallow或更高版本,你需要使用RequestPermission来请求用户权限。https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/ - Ryan Alford
使用 var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.Path; 的方法似乎已经过时了。我没有找到它,所以我提出了一个问题Microsoft文档显示,使用 .Net 方法可能更容易。如果我错了,请纠正我。 - Vandrey
4个回答

4

如果您使用的是Android 6.0或以上版本,则需要进行运行时权限检查。可以通过以下方式实现:

if ((CheckSelfPermission(Permission.ReadExternalStorage) == (int)Permission.Granted) && 
    (CheckSelfPermission(Permission.WriteExternalStorage) == (int)Permission.Granted))

更多相关信息可以在Android文档这里找到。


3
如果文件不存在,则先创建,再获取绝对路径并将数据写入其中。
     Java.IO.File sdCard = Android.OS.Environment.ExternalStorageDirectory;
     Java.IO.File dir = new Java.IO.File (sdCard.AbsolutePath + "/MyFolder");
     dir.Mkdirs ();
     Java.IO.File file = new Java.IO.File (dir,"iootext.txt");
        if (!file.Exists ()) {
            file.CreateNewFile ();
            file.Mkdir ();
            FileWriter writer = new FileWriter (file);
            // Writes the content to the file
            writer.Write (jsonData);
            writer.Flush ();
            writer.Close ();
        }

0

我曾经遇到同样的问题,花了几个小时后,我发现如果你在sdk版本高于23、Android版本高于6上运行,你应该向用户实施访问请求。请在this链接中查找更多信息。


0

我可能来晚了,但是在整整一天的挖掘后,我发现对我有用的唯一一件事情来自于这个链接。 我谜题中缺失的一块是在读写文件时使用Environment.SpecialFolder.LocalApplicationData

以下是一个简单的总结示例,使用上面链接中的细节,稍作修改以便易于使用:

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "notes.txt");

// read 
string fileData = File.ReadAllText(fileName);

// write
File.WriteAllText(fileName, fileData);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接