Xamarin 表单 - 文件系统

Xamarin Forms - File System

我正在开发跨平台应用程序(UWP - 目标版本 16299,Android 目标版本 Pie 和 iOS;Visual Studio 2019 - Xamarin.Forms 4.1。 0) 需要与在 AppData 中创建的本地数据库文件进行通信。在我尝试将信息导出到 AppData 之外的另一个文件之前,一切都很好很有趣。 我试了很多东西都没有成功,我很好奇为什么它对你有用而不对我有用。

这是我测试过的最新代码,与其他代码类似,结果相同:
抛出异常:System.Private.CoreLib.dll

中的“System.UnauthorizedAccessException
using Plugin.FilePicker;
using Plugin.FilePicker.Abstractions;
using Plugin.Permissions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.PlatformConfiguration;

namespace Testing
{

    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        private Plugin.FilePicker
            .Abstractions.FileData file;


        private async void ImportBtn_Clicked(object sender, EventArgs e)
        {
            try
            {
                file = await CrossFilePicker.Current.PickFile();


            }
            catch (Exception ex)
            {

            }

            file.FileName = "rooms.jpg";
            file.FilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            await CrossFilePicker.Current.SaveFile(file);
        }

        private void ExportBtn_Clicked(object sender, EventArgs e)
        {

            {
                string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
                string localFilename = "download.txt";
                string localPath = Path.Combine(documentsPath, localFilename);

                try 
                {  
                   File.Create(localPath); 
                }
                catch(Exception ex) 
                { Debug.WriteLine(ex); }
                Debug.WriteLine(localPath);

            }

        }
    }
}

我想提一下,所有功能都已勾选,为了让某些功能正常工作,import_clicked 按预期工作,尝试的文件夹(个人、音乐、图片、共享)是空的.

在本地项目中测试 ExportBtn_Clicked 代码后。它发生同样的错误。

Exception thrown: 'System.UnauthorizedAccessException' in System.Private.CoreLib.dll

System.UnauthorizedAccessException: Access to the path 'C:\Users\xxx\Documents\download.txt' is denied. at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle) at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.File.Create(String path) at App8.MainPage..ctor()

从应用程序外部访问文件时,此问题发生在 UWP 中。然后我找到了关于这个错误的类似讨论。

Access to the path 'C:\Sites\content\ServerIpAddress.txt' is denied

然后我参考File access permissions,问题是UWP想要获取应用程序范围之外的文件,你需要使用Windows.Storage。如果有必要使用Documents文件夹,你可以参考这个进入。

Accessing additional locations

using Windows.Storage;
var x = await StorageFolder.GetFolderFromPathAsync(@"C:\Users\UserName\Documents"); await x.CreateFileAsync("newfile.txt");

注意:最好在应用程序中使用沙箱文件夹,这将具有完整权限。

Android中,如果想用External storage实现如下:

 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,"download.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 ();
    }