You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hololens 2 UWP应用无法访问ApplicationData漫游文件夹文件求助

解决Hololens 2 UWP应用读取AppData文件的问题

问题背景

我是Hololens 2开发新手,正在使用Unity开发面向Hololens 2的UWP应用,该应用通过XML配置文件获取3D对象相对于标记点的放置信息。在Unity编辑器和Hololens设备中读取Resources文件夹的文件,以及在Unity中读取PC端AppData的文件时均正常,但尝试读取Hololens设备的AppData文件夹(包括KnownFolders特殊文件夹)中的文件时遇到问题。

我使用ApplicationData.Current.RoamingFolder.Path作为UWP内部文件夹路径(可通过DevicePortal访问),并通过StorageFolder和StorageFile在新Task中调用await异步方法。同时我已修改package.appxmanifest文件,添加了.xml文件的FileTypeAssociation配置。我担心ApplicationData.Current.RoamingFolder.Path路径中作为用户名的微软账户邮箱(user@mail.com)会对异步方法产生影响。

相关代码

引用部分

//...
using System.Xml.Linq;
using System.Threading.Tasks;
//...

#if WINDOWS_UWP
using Windows.Storage;
#endif

流加载代码

#if WINDOWS_UWP      
        try
        {
            folderPathName = ApplicationData.Current.RoamingFolder.Path;
            using (Stream s = openFileUWP(folderPathName, filenameWithExtension)) 
            {
                document = XDocument.Load(s);
            }
        }
        catch (Exception e)
        {
            document = XDocument.Parse(targetFile.text); //the XML file in Resources folder
        }
#else
        //...
#endif

openFileUWP函数

#if WINDOWS_UWP
    private Stream openFileUWP(string folderName, string fileName)
    {
        Stream stream = null;

        Task task = new Task(
                        async () =>
                        {
                            StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folderName);
                            StorageFile file = await folder.GetFileAsync(fileName);  
                            stream = await file.OpenStreamForReadAsync(); 
                        });
        
        task.Start();
        task.Wait();            

        return stream;
    }
#endif

问题分析与解决方案

核心问题

你的代码中存在异步操作误用的问题:在Task中嵌套async lambda后调用task.Wait(),会导致UI线程死锁,而且异步操作完成前stream可能仍为null,这才是读取失败的主要原因,和路径中的邮箱名称无关。

修正后的代码

流加载代码修改

#if WINDOWS_UWP      
try
{
    // 直接使用StorageFolder实例,避免路径解析问题
    var targetFolder = ApplicationData.Current.RoamingFolder;
    using (Stream s = await openFileUWP(targetFolder, filenameWithExtension)) 
    {
        document = XDocument.Load(s);
    }
}
catch (Exception e)
{
    document = XDocument.Parse(targetFile.text); //  fallback到Resources文件夹的文件
}
#else
//...
#endif

openFileUWP函数修改

#if WINDOWS_UWP
// 改为返回Task<Stream>,直接使用async/await语法
private async Task<Stream> openFileUWP(StorageFolder folder, string fileName)
{
    StorageFile file = await folder.GetFileAsync(fileName);  
    return await file.OpenStreamForReadAsync(); 
}
#endif

额外注意事项

  • 优先使用StorageFolder实例而非路径字符串:UWP的Storage API设计更倾向于使用对象而非路径,能避免路径解析出错的问题
  • 确保XML文件已正确部署:可通过DevicePortal将文件上传到Hololens设备的LocalAppData\<你的应用包名>\Roaming目录
  • FileTypeAssociation无需用于读取应用自身存储:该配置是让应用关联系统中的外部.xml文件,读取应用私有目录下的文件不需要此配置

内容的提问来源于stack exchange,提问作者TheTeam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:55:12