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
相关产品推荐
相关产品推荐

