【问题标题】:System.UnauthorizedAccessException C# Windows 10 Phone EmulatorSystem.UnauthorizedAccessException C# Windows 10 手机模拟器
【发布时间】:2017-07-13 12:18:37
【问题描述】:

我知道在看似相同的问题上有很多线程,但我无法在 3 小时后解决这个问题,所以我真的需要一些帮助。

我了解我收到此错误是因为系统无权访问该文件。我已尝试将权限设置为 full 和一些其他代码 sn-ps 来解决我的问题,但都没有奏效。

这是一个使用 Xaramin 的 Windows 10 应用,

我正在尝试使用 XML 文件中的联系人填充列表框。我将列表框 itemsSource 设置为“数据上下文”和路径“myList”。 XML 构建操作设置为“内容”,复制到输出目录设置为“始终复制”。

我尝试按照初学者课程中的教程学习 3 次,但总是遇到同样的错误。

这是我收到的错误

下面是页面上的完整代码。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Xml;
using System.Xml.Linq;
using Windows.Storage;
using System.Collections.ObjectModel;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace ContactsApp
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        string TEMPFILEPATH = "";
        string TARGETFILEPATH = "";
        private ObservableCollection<string> lstd = new ObservableCollection<string>();
        public ObservableCollection<string> myList { get { return lstd; } }
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Grid_Loading(FrameworkElement sender, object args)
        {
            Windows.ApplicationModel.Package package = Windows.ApplicationModel.Package.Current;
            StorageFolder installedLocation = package.InstalledLocation;
            StorageFolder targetLocation = ApplicationData.Current.LocalFolder;

            TEMPFILEPATH = installedLocation.Path.ToString() + "\\Contacts.xml";
            TARGETFILEPATH = targetLocation.Path.ToString() + "\\Contacts.xml";
            File.Move(TEMPFILEPATH, TARGETFILEPATH);
            loadContacts();
        }
        private void loadContacts()
        {
            XmlReader xmlReader = XmlReader.Create(TARGETFILEPATH);
            while (xmlReader.Read())
            {
                if (xmlReader.Name.Equals("ID") && (xmlReader.NodeType == XmlNodeType.Element))
                {
                    lstd.Add(xmlReader.ReadElementContentAsString());
                }
            }
            DataContext = this;
            xmlReader.Dispose();
        }
    }
}

我将永远感激有关此事的任何帮助。 :)

【问题讨论】:

    标签: c# xml visual-studio xamarin access-denied


    【解决方案1】:

    您不应尝试在受限环境(如 Windows Phone)中访问受限路径。

    相反,如果您确实需要将此文件嵌入您的应用程序,请将您的 xml 文件的构建操作更改为 Embedded ResourceDo not copy,然后将代码中的资源作为嵌入式资源检索:

    public void LoadContacts()
    {
        const string fileName = "Contacts.xml";
    
        var assembly = typeof(MainPage).GetTypeInfo().Assembly;
    
        var path = assembly.GetManifestResourceNames()
            .FirstOrDefault(n => n.EndsWith(fileName, StringComparison.OrdinalIgnoreCase));
    
        if(path == null)
            throw new Exception("File not found");
    
        using (var stream = assembly.GetManifestResourceStream(path))
        using (var reader = XmlReader.Create(stream))
        {           
            while (reader.Read())
            {
                if (reader.Name.Equals("ID") && (reader.NodeType == XmlNodeType.Element))
                {
                    lstd.Add(reader.ReadElementContentAsString());
                }
            }
        }
    
        DataContext = this; // better to move this inside the constructor
    }
    

    【讨论】:

    • 嗨,伙计,他的回答为他欢呼。我按照你说的做了,现在我的代码看起来像这样 https://pastebin.com/sXS4262y 。我在第 49 行遇到错误。类型不包含程序集,也没有扩展方法程序集接受类型为“类型”的第一个参数。我尝试使用 system.reflection 添加,但没有奏效。我也按照你说的修改了xml文件设置。
    • 忘记添加 UWP 中需要的 GetTypeInfo()。编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多