File.ReadAllText(): System.UnauthorizedAccessException: 'Access to the path is denied.'

File.ReadAllText(): System.UnauthorizedAccessException: 'Access to the path is denied.'

这是我遇到问题的代码片段:

public OpenPage(string filePath, int? index, object jobject)
        {
            InitializeComponent();

            File.SetAttributes(filePath, FileAttributes.Normal); // Here is where error in title occurs
            var readText = File.ReadAllText(filePath); // Also occurs here
            
            DisplayAlert("Alert", readText, "Ok");      
        }

我正在创建一个 UWP Xamarin.Forms 应用程序,它需要从选定目录(C: 驱动器上的任何内容)读取文件。虽然当我不从本地缓存/AppData 中选择文件时标题中出现错误。

查看 Whosebug 中的其他类似 post(例如 Why is access to the path denied?)对于了解有关该主题的更多信息非常有用,尽管有关此错误的许多问题都已过时。

在上面的post中,有人说目录不能作为File.ReadAllText()的参数传递。

有什么解决办法吗?我需要访问 C: 驱动器上的文件。作为参考,我调试时构造函数中的filePath是“”C:\Users\ianpc\Desktop\config file clones\te0_ptt_wog.json”.

Is there any work around to this? I need access to files on the C: drive. For reference, the filePath in the constructor when I was debugging was ""C:\Users\ianpc\Desktop\config file clones\te0_ptt_wog.json".

问题是 UWP 应用程序在沙箱环境中运行,所以我们不能使用 System.IO 命名空间直接访问带有路径的文件。

对于 xamarin forms 应用程序,我们建议您使用 Windows 存储 api 通过路径访问文件,在此之前,您需要启用 broadFileSystemAccess 功能。

例如

public interface FileAccessInterface
{
    Task<string> GetFileText(string filePath);
}

实施

[assembly: Dependency(typeof(FileAccessInterfaceImplementation))]
namespace XamarinPicker.UWP
{
    public class FileAccessInterfaceImplementation : FileAccessInterface
    {
        public async Task<string> GetFileText(string filePath)
        {
            var stringContent = "";
            try
            {
                var file = await StorageFile.GetFileFromPathAsync(filePath);
               
                if (file != null)
                {
                    stringContent = await Windows.Storage.FileIO.ReadTextAsync(file,Windows.Storage.Streams.UnicodeEncoding.Utf8);
                }
            }
            catch (Exception ex)
            {

                Debug.WriteLine(ex.Message);
            }

            return stringContent;
        }
    }
}

用法

var text = await DependencyService.Get<FileAccessInterface>().GetFileText(@"C:\Users\xxxx\Desktop\test.txt");

更多请参考本案例