UWP C#在LocalFolder创建文件遇空引用及加载异常求助
UWP文件操作异常排查与修复
问题根源分析
你的代码存在几个关键问题,直接触发了System.IO.FileLoadException和System.NullReferenceException:
- 冗余的文件/文件夹重复获取:调用
CreateFolderAsync(传入OpenIfExists参数)已经会返回目标文件夹,后续再调用GetFileAsync完全多余,反而可能因异步状态异常导致对象为空。 - 缺失空值校验:即使调用了创建方法,极端情况下文件/文件夹对象仍可能为null,直接传入
FileIO方法会触发空引用异常。 - 不必要的
volatile修饰:FOLDER和FILES_MANAGER_CACHE用volatile修饰毫无意义,UWP异步操作本身线程安全,反而可能干扰正常异步状态。
修复后的代码
public static class FilesManager { public static StorageFolder ROOT_DIRECTORY, USER_DIRECTORY; public static StorageFile FILES_MANAGER_CACHE_FILE; public static string FILES_MANAGER_CACHE; public static StorageFolder FOLDER; public static async Task Init() { try { // 直接创建或打开文件夹,无需重复获取 FOLDER = await ApplicationData.Current.LocalFolder.CreateFolderAsync("DashData", CreationCollisionOption.OpenIfExists); if (FOLDER == null) { Debug.WriteLine("无法创建或获取DashData文件夹"); return; } // 直接创建或打开文件,无需重复获取 FILES_MANAGER_CACHE_FILE = await FOLDER.CreateFileAsync("filesmanageruserdata.json", CreationCollisionOption.OpenIfExists); if (FILES_MANAGER_CACHE_FILE == null) { Debug.WriteLine("无法创建或获取filesmanageruserdata.json文件"); return; } await LoadFilesManagerCacheAsync(); Debug.WriteLine("TEXT: " + FILES_MANAGER_CACHE); } catch (Exception e) { Debug.WriteLine("ERROR: " + e.ToString()); } } public static async Task LoadFilesManagerCacheAsync() { // 增加空值校验,避免空引用 if (FILES_MANAGER_CACHE_FILE == null) { Debug.WriteLine("文件引用为空,无法读取内容"); return; } FILES_MANAGER_CACHE = await FileIO.ReadTextAsync(FILES_MANAGER_CACHE_FILE); } public static async Task storeUserData(string content) { try { if (FILES_MANAGER_CACHE_FILE == null) { Debug.WriteLine("文件引用为空,无法写入内容"); return; } await FileIO.WriteTextAsync(FILES_MANAGER_CACHE_FILE, content); } catch (Exception e) { Debug.WriteLine("ERROR: " + e.ToString()); } } }
额外注意事项
- 确认应用权限:UWP对
ApplicationData.Current.LocalFolder的访问是默认允许的,若后续扩展到其他存储位置,需在Package.appxmanifest中声明对应权限。 - 异步调用规范:启动时调用
Init()必须通过await方式执行,避免因异步未完成导致后续操作使用未初始化的对象。
内容的提问来源于stack exchange,提问作者Gloomstick
相关产品推荐
相关产品推荐

