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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:15:58