File.WriteAllText System.UnauthorizedAccessException 在 Xamarin.forms 中使用 JSON 访问路径 'c:\mafirst.json' 被拒绝错误

File.WriteAllText System.UnauthorizedAccessException Access to the path 'c:\mafirst.json' is denied error in Xamarin.forms using JSON

我是 xamarin 的新手,我想从一个简单的 button_clicked 事件中将一些数据写入 json 文件。

这是我的代码: `

        JObject jsontry = new JObject(
                        new JProperty("newprop", "true"));



        File.WriteAllText(@"c:\mafirst.json", jsontry.ToString());//this line gives the error

        // write JSON directly to a file
        using (StreamWriter file = File.CreateText(@"c:\Users\Flora\Desktop\mafirst.json"))//this line gives the same error as well
        using (JsonTextWriter writer = new JsonTextWriter(file))
        {
            jsontry.WriteTo(writer);
        }

`

错误:System.UnauthorizedAccessException:“访问路径 'c:\mafirst.json' 被拒绝。”

我尝试了不同的路径,在同一个项目中编写了相同的代码,但使用了不同的 .cs 文件,基本上我已经尝试了所有想到的想法和来自网络的解决方案,但没有任何效果。

编辑:

很抱歉缺少有关该应用程序的信息。这个应用程序对我来说只是一个学习项目。我 运行 这段代码只在 UWP 应用程序中,所以我把它当作一个 UWP 应用程序,我猜这是合乎逻辑的(?),这就是我使用像 (C:\Desktop\blabla.bla 这样的路径的唯一原因).

我 运行 visual studio 具有管理员权限,但这似乎不起作用,我只想将一些数据从我的 UWP 应用程序的 C# 代码写入并存储到 JSON 文件在本地。

感谢您的帮助。

“沙盒”中的 Xamarin 应用程序 运行:除非拥有权限,否则应用程序只能访问很少的内容,并且它们只能写入和读取为您的应用程序创建的文件夹(这样应用程序就不会弄乱与其他应用程序的files/data)。

对于应用程序沙箱内的文件存储,请查看(例如):

https://docs.microsoft.com/en-us/xamarin/android/platform/files/

您可以在指定路径的文件夹中写入文件(例如):

System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData)

返回的路径在 Windows、Android 和 iOS 上不同。最重要的是:你可以访问它。

请注意,您可以选择多个 Environment.SpecialFolder 枚举值。

对于文件路径,您可以使用:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "somefile.txt");

我在 UWP 和 Android 的共享项目中经常使用 Environment.SpecialFolder.LocalApplicationData

最初,您使用的路径 c:\Users\Flora\Desktop\mafirst.json 在您的 PC 上。

当您使用 Xamarin.Forms 时,您可以将此路径用于 UWP。但是对于 Android 和 ios,你不能。

在 UWP 上,当你想在桌面上读取或写入文件时,你可以设置功能。

在 UWP 的 Package.appxmanifest 中添加如下 broadFileSystemAccess

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" 
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">

  .............

  <Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
</Package>

然后部署应用,在应用设置中开启文件系统权限。

使用StorageFolder获取文件夹,如果文件不存在则创建文件。并且需要依赖服务来完成。

在Xamarin.Forms中创建接口:

public interface IFileManager
{
    void WriteFile();
}

UWP 中的实现:

[assembly: Dependency(typeof(FileManager))]
namespace XFUWPFileSystem.UWP
{
public class FileManager : IFileManager
{
    public async void WriteFile()
    {
        JObject jsontry = new JObject(
                           new JProperty("newprop", "true"));
        var folder = await StorageFolder.GetFolderFromPathAsync(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));//Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData
        StorageFile sampleFile = await folder.CreateFileAsync("mafirst.json", CreationCollisionOption.OpenIfExists);
        await Windows.Storage.FileIO.WriteTextAsync(sampleFile, jsontry.ToString());
    }

  }
}

您可以查看下面关于 Locations that UWP apps can access 的 link:https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

UWP 的依赖服务:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/introduction#universal-windows-platform