Проблема с Hololens авторизацией доступа к данным - PullRequest
0 голосов
/ 28 сентября 2018

Ошибка при доступе к данным приложения

Я использовал Unity3d (2017.4.1 f1) для экспорта моего приложения в VS2017, но обнаружил, что документ .xml (в каталоге/Asset/.xml) не был экспортирован. Так что я скопировал XML-документ в /app/data. Затем я снова отладил, произошла ошибка, он сказал мне, что у меня нет разрешения на доступ к данным.Я решил эту проблему? Могу ли я изменить каталог и какой каталог я могу прочитать?

Ошибка

    Exception thrown: 'System.UnauthorizedAccessException' in System.IO.FileSystem.dll
UnauthorizedAccessException: Access to the path 'C:\Data\Users\DefaultAccount\AppData\Local\DevelopmentFiles\BeautifulSolarVS.Debug_x86.hp\Data\solar.xml' is denied.
   at System.IO.Win32FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs)
   at System.IO.Win32FileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)
   at System.IO.MultiplexingWin32WinRTFileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.FileStream..ctor(String path, FileMode mode)
   at OperationAll.QueryXml(String xmlname, String queryingname)
   at OperationAll.HoloToolkit.Unity.InputModule.IFocusable.OnFocusEnter()
   at HoloToolkit.Unity.InputModule.InputManager.<>c.<.cctor>b__118_0(IFocusable handler, BaseEventData eventData)
   at UnityEngine.EventSystems.ExecuteEvents.Execute[T](GameObject target, BaseEventData eventData, EventFunction`1 functor)

Мой код

 string QueryXml(string xmlname,string queryingname)
    {
        string filepath = Application.dataPath +@xmlname;
        StreamReader fp = new 
        StreamReader(newFileStream(filepath,FileMode.Open));

    if (File.Exists(filepath))
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(fp);

        XmlNodeList nodelist = xmlDoc.GetElementsByTagName("sample");           
        foreach (XmlElement xe in nodelist)
        {
            if (xe.FirstChild.InnerText == queryingname)
            {
                return xe.LastChild.InnerText;
            }

        }
    }
    return null;
}
void IFocusable.OnFocusEnter()
    {
        this.gameObject.transform.localScale = new Vector3(1.5f, 1.5f,1.5f);
        string ob_selected_name = this.transform.name;
        string ob_attribute = QueryXml(xml_name, ob_selected_name);
        GameObject.Find("Panel1/Display/Text").GetComponent<UnityEngine.UI.Text().text = ob_attribute;}

И я прочитал MS документ для UWP , но я не уверен, где мой xml и appdatapath.Вот мои тестовые коды

//test1
   string QueryXml(string xmlname,string queryingname)
{
    try
    {

        XmlDocument xmlDoc = new XmlDocument();

        var asyncOpt = ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(xmlname);
        asyncOpt.Wait();
        using (var fileStream = asyncOpt.Result)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            using (var reader = XmlReader.Create(fileStream, settings))
            {
                //加载Xml文件
                xmlDoc.Load(reader);
            }
            XmlNodeList nodelist = xmlDoc.GetElementsByTagName("sample");           
            foreach (XmlElement xe in nodelist)
            {
                if (xe.FirstChild.InnerText == queryingname)
                {
                    return xe.LastChild.InnerText;
                }

            }
        }
    }
    catch (System.Exception e)
    {
        Debug.Log("still fail");
        Debug.Log(ApplicationData.Current.LocalFolder.Path);


    }
    return null;

}
Error:

Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.ni.dll
Exception thrown: 'System.IO.FileNotFoundException' in System.Runtime.WindowsRuntime.dll
Exception thrown: 'System.AggregateException' in System.Private.CoreLib.ni.dll
still fail
C:\Data\Users\96385\AppData\Local\Packages\BeautifulSolar_pzq3xp76mxafg\LocalState

//test2
string QueryXmlTest( string queryingname)
{
    XmlDocument xmlDoc = new XmlDocument();
    StorageFolder docLib = KnownFolders.DocumentsLibrary;
    var docFile = docLib.OpenStreamForReadAsync("Data\\solar.xml");
    docFile.Wait();
    var fs = docFile.Result;
    using (fs)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        using (var reader = XmlReader.Create(fs, settings))
        {
            //加载Xml文件
            //Debug.Log(reader);
            xmlDoc.Load(reader);
        }
        XmlNodeList nodelist = xmlDoc.GetElementsByTagName("sample");
        foreach (XmlElement xe in nodelist)
        {
            if (xe.FirstChild.InnerText == queryingname)
            {
                return xe.LastChild.InnerText;
            }

        }
    }
    return null;
}
Error:Exception thrown: 'System.UnauthorizedAccessException' in Assembly-CSharp.dll
UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
   at Windows.Storage.KnownFolders.get_DocumentsLibrary()

Я не знаю, где находится мой solar.xml, а ApplicationData.Current.LocalFolder C:\Data\Users\96385\AppData\Local\Packages\BeautifulSolar_pzq3xp76mxafg\LocalState. Расположение solar.xml в VS - это / App и / App/ data (я скопировал два) Рисунок in / data / Как мне прочитать мой xml?

in /

1 Ответ

0 голосов
/ 29 сентября 2018

Вы должны использовать папку StreamingAssets (Assets / StreamingAssets - создайте ее, если она не существует), чтобы включить дополнительные файлы XML в свою сборку.

Копирование файлов вручную после сборки можетбудет плохим решением, так как позже его легко забыть, и это приведет к проблемам с разрешениями / манифестами, которые вы видите.

Чтобы получить файл, который вы помещаете в StreamingAssets из скрипта, вы можете использовать File.ReadAllBytes с Application.streamingAssetsPath .

Например:

string fileURI = Path.Combine(Application.streamingAssetsPath, "myFile.xml");
byte[] xmlAsBytes = File.ReadAllBytes(fileURI);
...