HoloLens文本文件读写异常:可写入但无法读取(Unity、HoloLens、C#)
解决HoloLens上Unity文本文件读取问题
嘿,看你的代码已经搭好了写入的架子,但读取逻辑没跟上对吧?在HoloLens运行的UWP环境里,文件操作得严格遵循异步规范,还要注意路径和权限的限制,我帮你把读取逻辑补全,顺便优化下整体代码结构:
问题根源
你的写入用了异步Task,但读取同样需要用UWP的异步API,而且不能忽略异步操作的等待——如果直接在同步方法里调用异步读取,很可能还没读完就去拿结果,自然得到空内容。另外,要保证读写用的是同一个应用私有存储目录,HoloLens对文件系统的权限限制比较严,不能随便用其他路径。
完整可运行的读写代码
直接替换你的现有代码就行:
using UnityEngine; using System.Threading.Tasks; using Windows.Storage; using System.IO; public class FileInOut : MonoBehaviour { string plainText = ""; TextMesh textmesh; void Start () { textmesh = GameObject.Find ("Text").GetComponent<TextMesh>(); textmesh.text = "Hallo"; // 先测试文本显示正常 // 启动异步读写流程(Start不能直接加async,所以用下划线忽略返回值) _ = RunReadWriteOperations(); } // 统一处理异步读写的方法,这里可以加async async Task RunReadWriteOperations() { // 先写入测试内容 await WriteToFile("MyTestFile.txt", "HoloLens文件读写测试成功!"); // 再读取文件内容 plainText = await ReadFromFile("MyTestFile.txt"); // 把读取到的内容显示出来 textmesh.text = plainText; } // 异步写入方法 async Task WriteToFile(string fileName, string content) { #if WINDOWS_UWP // 获取应用的本地存储目录,HoloLens有权限访问 StorageFolder localFolder = ApplicationData.Current.LocalFolder; // 创建或覆盖文件 StorageFile file = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); // 写入文本 await FileIO.WriteTextAsync(file, content); #endif } // 异步读取方法,返回读取到的文本 async Task<string> ReadFromFile(string fileName) { #if WINDOWS_UWP try { StorageFolder localFolder = ApplicationData.Current.LocalFolder; // 获取指定文件 StorageFile file = await localFolder.GetFileAsync(fileName); // 读取文本内容 return await FileIO.ReadTextAsync(file); } catch (FileNotFoundException) { // 处理文件不存在的情况 return "错误:未找到目标文件"; } catch (System.Exception ex) { // 捕获其他异常 return $"读取失败:{ex.Message}"; } #endif return ""; } }
几个必须注意的点
- 异步操作的正确调用:Unity的
Start方法不能标记为async,所以我们用一个单独的异步方法RunReadWriteOperations来处理读写,然后用_ = 方法名()的方式启动,避免阻塞主线程。 - 目录选择:必须用
ApplicationData.Current.LocalFolder,这是UWP应用的私有目录,HoloLens默认允许访问,不要用Unity的Application.persistentDataPath(虽然在UWP下指向同一个位置,但直接用UWP API更可靠)。 - 异常处理:读取时加了异常捕获,避免因为文件不存在、权限问题导致应用崩溃,同时能直观看到错误原因。
- 文件覆盖选项:写入时用
CreationCollisionOption.ReplaceExisting会覆盖旧文件,如果需要追加内容,可以换成CreationCollisionOption.OpenIfExists,然后用FileIO.AppendTextAsync。
验证步骤
部署到HoloLens后,你会看到TextMesh先显示"Hallo",几秒后切换成读取到的测试内容。如果显示错误信息,先检查文件名是否拼写正确,或者确认写入操作是否成功(可以在写入后加个日志输出验证)。
内容的提问来源于stack exchange,提问作者XyDrK Rulof
相关产品推荐
相关产品推荐

